0

我有一个在 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,而不是成功时的预期路径或失败时的错误路径?

谢谢!

4

1 回答 1

1

代替

$request->file->store()

尝试使用

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

此方法将执行相同的操作,如果成功或false错误将返回文件路径。此外,在返回 JSON 响应时,您应该返回一个数组:

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

这应该这样做

于 2020-11-13T17:30:51.917 回答