2012-09-10 8 views
6

Przesyłam plik z XMLHttprequest. Oto funkcja JS, który przesyła plik:Wgrywanie pliku z XMLHttprequest - Brakujące obramowanie w wieloczęściowym/formularzowym-danych

var upload = function(file) { 
    // Create form data 
    var formData = new FormData(); 
    formData.append('file', file); 

    var xhr = new XMLHttpRequest(); 

    // Open 
    xhr.open('POST', this.options.action); 

    // Set headers 
    xhr.setRequestHeader("Cache-Control", "no-cache"); 
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    xhr.setRequestHeader("Content-Type", "multipart/form-data"); 
    xhr.setRequestHeader("X-File-Name", file.fileName); 
    xhr.setRequestHeader("X-File-Size", file.fileSize); 
    xhr.setRequestHeader("X-File-Type", file.type); 

    // Send 
    xhr.send(formData); 
} 

Po stronie serwera, w upload.php czytam plik w ten sposób:

file_put_contents($filename, (file_get_contents('php://input'))); 

wszystko działa w porządku, poza tym, że Otrzymuję ostrzeżenie PHP:

Missing boundary in multipart/form-data POST data in Unknown on line 0.

Jeśli usuniemy tę linię: xhr.setRequestHeader("Content-Type", "multipart/form-data"); ostrzeżenie zniknie.

Jaki powinien być problem?

+1

Spróbuj użyć 'application/x-www-form-urlencoded' jako typu zawartości. Lub pominąć, ponieważ jest to domyślny typ zawartości wysyłany przez żądanie ajax. –

+1

To może działać, ale w przypadku dużych plików (nawet 5-600 KB) przeglądarka zawiesi się, ponieważ musi wysłać plik w formacie "tekstowym". Muszę użyć "danych wieloczęściowych/formularza". –

+2

Przepraszam, przeoczony bit do przesyłania plików (nie wiem jak), ale [myślę, że to może odpowiedzieć na twoje zadanie] (http://stackoverflow.com/questions/5933949/how-to-send-multipart-form- data-form-content-by-ajax-no-jquery), a dokładniej: 'xhr.setRequestHeader (" typ zawartości "," wieloczęściowy/formularz danych, charset = utf-8; boundary = "+ Math.random () .toString(). substr (2)); 'powinno załatwić sprawę –

Odpowiedz

8

No to jest dziwne, trochę dla mnie, ale to, co zadziałało:

// Open 
xhr.open('POST', this.options.action, true); 

// !!! REMOVED ALL HEADERS 

// Send 
xhr.send(formData); 

W tym przypadku po stronie serwera nie czytam plik wysyłany poprzez php://input ale plik będzie tablica $_FILES.

Rozwiązało to mój problem, ale nadal jestem ciekawy, dlaczego pojawia się teraz plik w $_FILES?

Testowany w Chrome, Mozilli, Safari i IE10.

+8

[The spec] (http://www.w3.org/TR/XMLHttpRequest/#the-send-method) wyjaśnia (punkt 3), że przeglądarka ustawia poprawne nagłówki (w tym prawidłowe oznaczenie granicy wieloczęściowej w Wpisz), jeśli nic nie zostało ręcznie określone. Plik pojawia się w '$ _FILES', ponieważ PHP [automatycznie umieszcza pliki z wieloczęściowych przesłanych formularzy w tym superglobalu] (http://www.php.net/manual/en/features.file-upload.post-method.php). – Gijs

+0

Dziękuję za pomoc w zrozumieniu tego. –

+0

usunął sam plik 'multipart/form-data'. – ulab