Probleme mit Querystring


Benzol

Erfahrenes Mitglied
Einen wunderschönen...
bin gerade auf ein Problem in meinem neuen Upload Script gestoßen und kann mir den Fehler nicht wirklich erklären.

Ich habe eine Dynamische Uploadmaske auf meiner Internetseite. D.h. wenn ich bei einem File-Dialog eine Datei aussuche, wird dieser Dialog unsichtbar gemacht und ein neuer erstellt. Somit lassen sich quasi mehrer Daten auswählen und über ein Liste auch wieder entfernen.

Jetzt wird das Form an ein IFrame/Perlscript übermittelt welches den Datenstrom annimmt und in ein temporäres Verzeichnis schreibt. Zusätzlich dazu kann ich dann per Ajax-Objekt die schon Übertragenen daten abfragen und dem Benutzer einen Ladebalken anzeigen lassen.
Funktioniert alles soweit schon so gut...

Nun möchte ich natürlich nur Bilddaten übertragen. Das überprüfe ich einmal per JavaScript auf die Dateiendung... quasi nur um dem Benutzer etwas mehr Komfort zu geben. Eine zweite Sicherung ist im PHP Script, die die Datei dann sicher überprüft.
Nehme ich also eine Textdatei mit der Endung JPG, lädt er die Datei natürlich hoch und das PHP Script verweigert logischer Weise die Verarbeitung.

Nun dachte ich mir, das ich mir etwas Arbeit ersparen kann um den Benutzer wieder zur Eingabemaske zu bringen. Daher wird beim Upload die Eingabemaske unsichtbar gemacht und das Dialogfenster sichtbar. Tritt nun ein Fehler auf, kann man per Link in die Eingabemaske zurück gelangen. D.h. Eingabemaske wieder sichtbar und Dialog unsichtbar. Man findet dann natürlich die unveränderte Eingabemaske wie vor dem Upload vor. Wenn ich aber jetzt die Datei aus der Liste entferne - also quasi das File-Input Element entferne, welches die ungültige Datei enthält und eine gültige Datei hochlade, dann überträgt er mir die neue Datei ohne zu meckern und - jetzt kommt's - das Perlscript nimmt es nicht mehr als File-Input an!
Der Querstring, welcher an das PHP Script gesendet wird, lautet jetzt nicht mehr richtig sondern in etwa so &img1=%00test.JPG&

Übertragen tut er die Datei aber richtig... es ist also quasi kein Fehler im HTML-Upload denke ich. Der Teil der übertragenen Bilder nach dem Fehler sieht so aus
Code:
-----------------------------267493729520
Content-Disposition: form-data; name="img1"; filename=""
Content-Type: application/octet-stream


-----------------------------267493729520
Content-Disposition: form-data; name="img1"; filename="test.JPG"
Content-Type: image/jpeg


.
.
.
Das wiederum bedeutet für mich, das mein Perlscript die Daten nicht richtig verarbeitet... und das irgentwelcher Datenmüll übertragen wird... da der Erste Block irgentwie nicht da sein dürfte.
Ich muss zu meiner Schande gestehen, das ich von Perl nicht so viel Ahnung habe - ist sozusagen meine erste Begegnung mit der Sprache. Daher habe ich einiges im Netz gefunden, versucht zu verstehen und meinen Bedürfnissen anzupassen.

Der Teil des Perlscript, welches den Querystring erstellt ist folgender:
Perl:
my $cg = new CGI();
my $qstring="";
my %vars = $cg->Vars;
my $j=0;

while(($key,$value) = each %vars)
{

	if(defined $value && $value ne '')
	{	

		my $fh = $cg->upload($key);
		if(defined $fh)
		{
			#carp $fh;
			($tmp_fh, $tmp_filename) = tempfile(DIR => $tmp_dir);

			while(<$fh>) {
				print $tmp_fh $_;
			}

			close($tmp_fh);

			$fsize =(-s $fh);

			$fh =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
			$tmp_filename =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
			$qstring .= "file[name][$j]=$fh&file[size][$j]=$fsize&";
			$qstring .= "file[tmp_name][$j]=$tmp_filename&";
			$j++;
		}
		else
		{
			$value =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
			$qstring .= "$key=$value&" ;
		}
	}
}
Wie oben schon beschrieben funktioniert das ganze beim Ersten Anlauf problemlos auch mit mehreren Dateien... nur wenn der Fehler aufgetreten ist, ist etwas komisch.
Könnt Ihr mir helfen?