Laravel Storage store () возвращает HTML?

У меня есть приложение, работающее на 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 в случае неудачи?

Спасибо!


person mmerendo    schedule 13.11.2020    source источник


Ответы (1)


Вместо

$request->file->store()

попробуй использовать

$request->file('the_name_of_your_file')->store($path)

Этот метод сделает то же самое и вернет путь к файлу в случае успеха или false в случае ошибки. Кроме того, при возврате вашего ответа JSON вы должны вернуть массив:

return response()->json([
    'file_path' => $response
], 200);

Это должно сделать это

person Pablo Villalba    schedule 13.11.2020