对于我使用 Laravel 制作的订单系统,用户可以上传与订单相关的文件。这些通过 ajax 调用发送并由 Laravel 控制器处理,然后重新加载页面。
现在我遇到的问题是,在某个时刻,用户在短时间内上传了一些文件并且他们想要上传另一个文件后,他们贪婪地遇到了ERR_CONNECTION_TIME_OUT。注意每次文件都会上传成功。
我检查了 Apache 和 Laravel 错误日志,没有任何相关内容。我还检查了 php.ini 上传限制和执行时间,我认为它们不会造成任何问题,因为它们分别设置为 128Mb(它们仅上传 PDF)和 30 秒。
我在这里遗漏了什么吗?
阿贾克斯:
$("#upload").on( "click", function() {
var files = $('input[name=global_file]')[0].files;
var fd = new FormData();
fd.append('global_file',files[0]);
fd.append('tm_num', {{ $order['tm_num'] }});
$.ajax({
type: "POST",
url: '/admin/order/upload',
data: fd,
processData: false,
contentType: false,
success: function () {
window.location.reload();
}
});
});
控制器.php:
public function UploadOrderFile(Request $request)
{
$data = $request->all();
$file = $request->file('global_file');
$basepath = base_path();
$destinationPath = $basepath.'/orders/'.$data['tm_num'];
$fileName = $file->getClientOriginalName();
$file->move($destinationPath,$fileName);
return;
}
在ajax headers上,需要设置csrf token来访问请求。
$("#upload").on( "click", function() {
var files = $('input[name=global_file]')[0].files;
var fd = new FormData();
fd.append('global_file',files[0]);
fd.append('tm_num', {{ $order['tm_num'] }});
$.ajax({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type: "POST",
url: '/admin/order/upload',
data: fd,
processData: false,
contentType: false,
success: function () {
window.location.reload();
}
});
});
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
public function UploadOrderFile(Request $request)
{
$data = $request->all();
if(!$request->hasFile('global_file')) return false;
$file = $request->file('global_file');
$basepath = base_path();
$destinationPath = $basepath.'/orders/'.$data['tm_num'];
$fileName = $file->getClientOriginalName();
$request->store($destinationPath."/".$fileName);
return true;
}