2016-05-17 3 views
2

Я отправляю (возможно) несколько пользовательских файлов с помощью ajax на серверный PHP. Я отправляю его с помощью объекта FormData(), и когда я вызываю $_FILES в PHP, он говорит, что ключ файла объекта внутри FormData является «неопознанным индексом». Я знаю, что разделывали объяснение, так вот контекст:Получение файла (ов) через AJAX на стороне сервера PHP

HTML:

<form id="subForm" action="" method="post" enctype="multipart/form-data"> 
    <input type="file" name="file" multiple/> 
    <button type="submit">Post</button> 
</form> 

JQuery:

var files = $('input[type=file]').prop('files')[0]; //File list 
var formData = new FormData(); 

//Cycle through files (if many) 
for (var i = 0; i < files.length; i++) { 
    var file = files[i]; //File 

    //Type and size check 
    if (!file.type.match('image/*') && !file.type.match('video/*') && file.size > 8388608){ 
     continue; 
    } 

    // Add the file to the request. 
    formData.append('files', file, file.name); 
} 
$.ajax({ 
    type: 'POST', 
    url: 'submission.php', //Serverside handling script 
    enctype: 'multipart/form-data', 
    dataType: 'text', //Get back from PHP 
    processData: false, //Don't process the files 
    contentType: false, 
    cache: false, 
    data: formData, 
    success: function(php_script_response){ 
     console.log(php_script_response); 
    } 
}); 

PHP:

foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){ 
    if(is_uploaded_file($_FILES['files']['tmp_name'][$key]) && $_FILES['files']['tmp_name'][$key]['error']==0) { 
     $path = 'uploads/' . $_FILES['files']['name'][$key]; 
     $upload = true; 

     if(file_exists($path)){ 
      //Re-Upload 
      $upload = false; 
     } 

     if(move_uploaded_file($_FILES['files']['name'][$key], $path)){ 
      //Success 
     }else{ 
      //Failure 
     } 
    }else{ 
     //File not uploaded/ saved? 
    } 
} 

Линия 1 в PHP возвращает:

Неопределенные индекс: файлы в C: \ XAMPP \ HTDOCS \ submission.php

мое предположение, что что-то либо не так с моим локальным сервером Apache, или JQuery?

Заранее спасибо

+0

Используйте файл вместо файлов. Измените $ _FILES ['files'] на $ _FILES ['file'] –

+0

Я получаю ту же ошибку, но теперь вместо «файлов» не определено «файл». Я изменил «файлы» на «файл» как в JQuery, так и в PHP. – Lolechi

+1

Вы можете увидеть, что находится в массиве $ _FILES var_dump ($ _ FILES) –

ответ

1

The append никогда не достигается, потому что вы захватывая только одно значение из входного с .prop('files')[0]. Таким образом, files.length не определен в вашем цикле. Вы должны захватывать весь массив файлов:

var files = $('input[type=file]').prop('files'); //File list 
+0

Ах да, в этом была проблема. Не могли бы вы объяснить разницу между получением файлов с помощью '$ (...). Files' и' $ (...). Prop ('files') 'и почему нужно использовать' [0] '? – Lolechi

+1

[Этот ответ] (http://stackoverflow.com/a/13747921) имеет хорошее объяснение. В принципе, '.files' не будет работать с объектом jQuery, поэтому нам нужно использовать' .prop ('files') 'или выбрать первый элемент DOM в объекте. '[0]' просто возвращает первый элемент в объекте FileList или jQuery. –

Смежные вопросы