fix Cloudflare R2 Network connection lost error

想白嫖下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())才行