hotti: Request Content-Type Header bei Upload

Beitrag lesen

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>