从头开始:
我使用 XAMPP 作为测试项目的服务器堆栈,类似于谷歌驱动器。我想要实现的是用户可以上传任何大小和类型的文件。我正在使用它 Resumable.js,它将文件分成块(1024KB)并将其发送到服务器(Apache)。我认为这将排除php.ini
文件 ( upload_max_filesize
, post_max_size
) 中的更改?
为了测试,我使用了 9.6GB Linux 映像。有两个问题:
- 文件上传 4.5 小时(TTFB 每分钟从 300 毫秒增加到 10 秒,接近上传结束)。什么修复是可能的?
- 虽然上传“完成”它发送
Error 500
并且它不会将文件合并在一起。是否可以更改 Apache 配置中的某些内容?可能是响应错误?
当我测试小于〜1GB的它可以工作。那是压力测试。XAMPP 是空白安装,任何配置文件都没有改变。
JS函数处理上传:
let resumable = new Resumable({
target: '{{ route('upload.large') }}',
query:{_token:'{{ csrf_token() }}'} ,// CSRF token
fileType: [],
headers: {
'Accept' : 'application/json'
},
testChunks: false,
throttleProgressCallbacks: 1,
});
Controller中的上传功能:
public function upload(Request $request)
{
$receiver = new FileReceiver('file', $request, HandlerFactory::classFromRequest($request));
if (!$receiver->isUploaded()) {
// file not uploaded
}
$fileReceived = $receiver->receive(); // receive file
if ($fileReceived->isFinished()) { // file uploading is complete / all chunks are uploaded
$file = $fileReceived->getFile(); // get file
$extension = $file->getClientOriginalExtension();
$fileName = $file->getClientOriginalName(); //file name without extenstion
$disk = Storage::disk(config('filesystems.default'));
$path = $disk->putFileAs('videos', $file, $fileName);
// delete chunked file
unlink($file->getPathname());
return [
'path' => asset('storage/' . $path),
'filename' => $fileName
];
}
// otherwise return percentage informatoin
$handler = $fileReceived->handler();
return [
'done' => $handler->getPercentageDone(),
'status' => true
];
}