Я загружаю файл с XMLHttprequest. Вот функция JS, которая загружает файл:
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); }
На стороне сервера, в upload.php, я читаю файл следующим образом:
file_put_contents($filename, (file_get_contents('php://input')));
Все работает отлично, за исключением того, что я получаю предупреждение PHP:
Missing boundary in multipart/form-data POST data in Unknown on line 0
.
Если я удалю эту строку: xhr.setRequestHeader("Content-Type", "multipart/form-data");
предупреждение уходит.
В чем проблема?
Ну, это немного странно для меня, но это то, что сработало:
// Open xhr.open('POST', this.options.action, true); // !!! REMOVED ALL HEADERS // Send xhr.send(formData);
В этом случае на стороне сервера я не читаю файл, отправленный через php://input
но файл будет в массиве $_FILES
.
Это решило мою проблему, но мне все еще интересно, почему теперь появляется файл в $_FILES
?
Протестировано в Chrome, Mozilla, Safari и IE10.