想白嫖下cloudflare的R2,workers上传文件的时候总是会出现Network connection lost error错误,
用的Hono包,完全照着cloudflare的官方文档抄
export const AddFile = async (c: Context): Promise<Response> => {
//save object
const data = await c.req.formData();
const file: File = data.get("file") as File;
const name = await md5(file) as string;
const bucket = c.env.DRIVE as R2Bucket
try {
const saved = await bucket.put(name, file, {
httpMetadata: {
contentType: file.type
},
customMetadata: {
createdAt: Date.now().toString(),
}
})
} catch (e) {
console.log(e)
return Error(c, CODE_CLOUDFLARE_SERVICE_FAILED, 'service unavailable,please try again later')
}
return Success(c, 'ok')
}
结果总是网络链接断开,用wrangler还有网站的Real-time Logs 啥信息都看不出来,刚出几个月,搜中文没结果,搜英文就一个,看完了都没解决,挠头,心态都崩了
就不信只有我一个人出这个错误,后来进去他们的官方discord频道里搜Network connection lost error,
还有个老哥哈哈,跟我一样的错误,代码都差不多,discord讨论链接 ,
官方回复推荐直接存request.body,可是我拿到文件要计算md5的,从formdata拿数据会把文件读到缓存里,有可能会超限,最后解决方案是存的时候调file.stream()就行
export const AddFile = async (c: Context): Promise<Response> => {
//save object
const data = await c.req.formData();
const file: File = data.get("file") as File;
const name = await md5(file.stream()) as string;
const bucket = c.env.DRIVE as R2Bucket
try {
const saved = await bucket.put(name, file.stream(), {
httpMetadata: {
contentType: file.type
},
customMetadata: {
createdAt: Date.now().toString(),
}
})
} catch (e) {
console.log(e)
return Error(c, CODE_CLOUDFLARE_SERVICE_FAILED, 'service unavailable,please try again later')
}
return Success(c, 'ok')
}
确实好使了,但是官方回复有点扯淡,我一个38kb文件读进内存会超限?
还有这里的加密也是。都要用stream方法,如果直接await md5(file),你会发现每次得到的md5值都是一样的,await md5(file.stream())才行