У меня есть приложение, работающее на Laravel 5.8, которое предоставляет пользователям несколько форм. Одна из этих форм требует загрузки файлов. Я использую очень простую реализацию Dropzone.js во внешнем интерфейсе, чтобы облегчить эти загрузки. Как только пользователь добавляет файл в Dropzone, приложение загружает файл, выбирая маршрут загрузки, который возвращает временное имя файла. Это временное имя файла добавляется в форму как скрытый ввод, который я затем использую при обработке формы при отправке.
Все это работает нормально, большую часть времени. Однако иногда мы получали сообщения об ошибках, что временное имя файла, возвращаемое маршрутом загрузки, — ‹html, а не ожидаемая строка имени файла или ложное логическое значение. Это приводит к ошибке формы, так как она не может найти файл по пути ‹html.
Я понятия не имею, почему это происходит. Я не могу воспроизвести ошибку самостоятельно, и, кажется, нет никакой логики или причины, когда это происходит. Нет стабильного времени, нет стабильного браузера или ОС, ничего.
Вот код для маршрута загрузки:
Route::post('upload', function(Request $request) {
try {
$response = $request->file->store('/', 'temp');
\Illuminate\Support\Facades\Log::channel('uploads')->info('File uploaded!', ['response' => $response]);
return response()->json($response, 200);
} catch(Exception $e) {
report($e);
return response()->json('Unknown error. Try again later.', 400);
}
})
Некоторые действительно странные вещи, на которые стоит обратить внимание:
Мы используем Sentry для перехвата исключений, и вы заметите, что при успешной загрузке файла создается журнал. В последний раз, когда эта ошибка произошла, Sentry не обнаружил никаких исключений, что наводит меня на мысль, что блокировка try прошла успешно, но в журналах также нет записи о загрузке. Sentry действительно перехватил исключение позже в строке обработки, которое снова показывает, что путь к загруженному файлу был ‹html, что подтверждает, что здесь блок try выполнен успешно. Но почему нет лога с полным HTML, чтобы я мог посмотреть, откуда он берется?
И, наконец, кто-нибудь знает, почему метод store() будет возвращать HTML вместо ожидаемого пути в случае успеха или false в случае неудачи?
Спасибо!