Я пытаюсь написать сценарий, который позволяет пользователю загружать папку. Обычно пользователь указывает папку, и все содержащиеся в ней файлы должны быть загружены с восстановлением относительного пути или структуры папок на сервере.
Часть html использует webkitdirectory,
<form action = "cmd/test" enctype = "multipart/form-data" method = "post">
<input id = "upload" name = "content[]" type = "file" value = "Input" directory webkitdirectory>
<input type = "submit" value = "submit">
</form>
И сервер написан на Laravel. Я надеялся использовать Request в Laravel, например
Route::any('cmd/test', function(\Illuminate\Http\Request $request) {
echo $request;
$files = $request->file('content');
echo json_encode($files);
//Store the files here...
});
Я попытался загрузить тестовую папку со следующим содержимым:
dir /s test
Directory of C:\Users\███████\Desktop\test
18-Nov-18 05:19 PM <DIR> .
18-Nov-18 05:19 PM <DIR> ..
18-Nov-18 05:19 PM 1 note1.txt
18-Nov-18 05:19 PM 1 note2.txt
18-Nov-18 05:20 PM <DIR> test1
2 File(s) 2 bytes
Directory of C:\Users\███████\Desktop\test\test1
18-Nov-18 05:20 PM <DIR> .
18-Nov-18 05:20 PM <DIR> ..
18-Nov-18 05:20 PM 1 note3.txt
1 File(s) 1 bytes
Total Files Listed:
3 File(s) 3 bytes
К моему удивлению, результат тестового скрипта выглядит следующим образом:
[{},{},{}]
Request::file() не извлекает никакой информации об имени файла или его содержимом. Тот же результат с Edge или Firefox. Какие-либо предложения?
Обновлено: В основном мне плохо не понимать, что тип возвращаемого значения - UploadedFile. Проблема с получением относительного пути к файлам для восстановления структуры папок остается.
Просто примечание по состоянию на 2018 год, не используйте webkitdirectory для производства (источник: MDN).
Попробовал на простом PHP в Chrome 70.0.3538.102 @ Windows 8, я правильно получаю файлы. Что содержится в $files, когда вы пробуете его на своей стороне?
Пробовал новый проект laravel 5.7, все еще пытаюсь на моем Chrome, работает нормально, я получил это: ibb.co/jjTmS0
попробуйте изменить name = "content []" на name = "content"
@Anwar Попробовал снова, это действительно сработало, но я был достаточно глуп, чтобы не осознавать, что 1. phpstorm не понимает, что $files был массивом UploadedFile; 2. json_encode ничего не сообщает о содержимом UploadedFile. Спасибо






Может быть актуально:
$_FILES['content']['name']действительно возвращает["note1.txt", "note2.txt", "note3.txt"], поэтому сервер действительно получает что-то о файлах.