hi,
Weiß der Teufel, was da los war.
Fehlersuche
dieser Request-Header muss vorhanden sein, bzw. serverseitig ankommen:
'CONTENT_TYPE' => 'multipart/form-data; boundary=---------------------------715254748006',
(die boundary kann auch anders lauten, die wird vom UserAgent zufällig erzeugt)
Mit untenstehendem Script kann das näher untersucht werden.
Fazit: Erstelle ein FormData-Objekt und überlasse das Setzen der Request-Header dem XHR-Objekt, dann funktioniert auch das Upload.
Schöne Grüße.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use CGI -private_tempfiles;
my $cgi = CGI->new;
if($cgi->param){
print "Content-Type: text/plain\n\n", Dumper \%ENV;
}
else{
read(DATA, my $html, -s DATA);
printf $html, $ENV{SCRIPT_NAME}, $ENV{SCRIPT_NAME};
}
__DATA__
Content-Type: text/html; Charset=UTF-8
<!DOCTYPE HTML>
<head>
<title>Upload</title>
</head>
<html><body>
<form action="%s" method="POST" Enctype="multipart/form-data" onSubmit="return false;">
<input type="file" name="file">
<button onClick="xup(this.form, cb)"> Auffi gehts! </button>
</form>
<script>
// Upload mit Ajax
function xup(form, cb){
var form_data = new FormData(form);
var xhr = new XMLHttpRequest();
xhr.open("POST", "%s", true);
// Das ist der Killer!!
// xhr.setRequestHeader("Content-type", "multipart/form-data");
// da fehlt die Boundary
// Das XHR-Objekt setzt diesen Header selbst!!!
xhr.send(form_data);
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
cb(xhr.response);
}
}
};
}
// Ajax CallBack
function cb(response){
alert(response);
}
</script>
</body></html>