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