1

从头开始:

我使用 XAMPP 作为测试项目的服务器堆栈,类似于谷歌驱动器。我想要实现的是用户可以上传任何大小和类型的文件。我正在使用它 Resumable.js,它将文件分成块(1024KB)并将其发送到服务器(Apache)。我认为这将排除php.ini文件 ( upload_max_filesize, post_max_size) 中的更改?

为了测试,我使用了 9.6GB Linux 映像。有两个问题:

  1. 文件上传 4.5 小时(TTFB 每分钟从 300 毫秒增加到 10 秒,接近上传结束)。什么修复是可能的?
  2. 虽然上传“完成”它发送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
    ];
}
4

1 回答 1

0

我正在接近解决这个问题(我自己也有)。似乎在将块合并在一起以重新创建原始文件时发生故障。一旦文件大小达到 4.4GB,我就会收到“无法打开输入流”。我怀疑文件追加是有限的或内存没有被释放。希望这有助于缩小范围。

于 2022-01-05T21:21:29.203 回答