我的工作人员中有这个处理程序:
const data = await event.request.formData();
const key = data.get('filename');
const file = data.get('file');
if (typeof key !== 'string' || !file) {
return res.send(
{ message: 'Post body is not valid.' },
undefined,
400
);
}
await BUCKET.put(key, file);
return new Response(file);
如果我注释掉
await BUCKET.put(key, file);
行,那么我将得到预期的文件响应。但是在函数中使用该行时,我收到错误:
Uncaught (in promise) Error: Network connection lost.
我已经确认,通过将
put
更改为 get
,我可以从该存储桶中检索文件,因此连接本身似乎没有问题。
我刚刚注意到您正在根据请求致电
formData
。这会导致您将对象读入 RAM。 Workers 有 128 MiB 限制,因此可能发生的情况是您超出了该限制(可能非常严重,因为我们确实提供了一些缓冲区),因此 Cloudflare 将终止您的 Worker。
您需要做的是确保上传原始文件(而不是作为表单)并访问原始 ReadableStream。或者,如果您确信文件有效负载(以及您需要的任何元数据)将出现在名称之后,您可以尝试编写 TransformStream 以流式传输方式解析有效负载。通常更改上传机制会更容易。