如何通过Cloudflare Workers将客户端文件上传流式传输至外部服务器?
Cloudflare Worker 流式代理文件上传 POST 请求
我正在用Cloudflare Worker代理一个需要身份验证的Web API,让部分功能可以匿名访问。目前普通POST请求已经正常工作,但处理文件上传的POST请求时,不知道怎么把客户端的文件数据流式传输到远程服务器。
我知道Streams API支持这种功能,比如下面这个示例:
export default { async fetch(request, env, ctx) { // 从源服务器获取响应 let response = await fetch(request); // 创建一个恒等TransformStream(也就是管道) // 可读端会成为新响应的主体 let { readable, writable } = new TransformStream(); // 开始传输主体数据。注意:这里不要用await! response.body.pipeTo(writable); // 在传输过程中返回我们的响应 return new Response(readable, response); } }
但我不清楚怎么基于这个示例,把客户端传来的文件上传POST请求流式传输到api.example.com/fileupload?
要实现客户端文件上传请求的流式转发,核心是直接将客户端请求的可读流传递给目标API的fetch请求,不需要额外创建TransformStream(除非你需要中途修改数据)。以下是具体实现:
export default { async fetch(request, env, ctx) { // 只处理文件上传的POST请求(可根据实际路径调整过滤规则) if (request.method === 'POST' && request.url.includes('/fileupload')) { // 构造目标API的请求选项 const targetUrl = 'https://api.example.com/fileupload'; const requestOptions = { method: request.method, headers: new Headers(request.headers), // 直接传递客户端请求的body(本身就是ReadableStream) body: request.body, // 根据实际需求调整mode、credentials等属性 mode: 'cors', credentials: 'omit' }; // 注入目标API所需的身份验证信息 requestOptions.headers.set('Authorization', `Bearer ${env.YOUR_AUTH_TOKEN}`); // 发起流式请求到目标服务器,Cloudflare会自动处理流的传输 const response = await fetch(targetUrl, requestOptions); // 流式返回目标服务器的响应,避免内存占用过高 const { readable, writable } = new TransformStream(); response.body.pipeTo(writable); return new Response(readable, response); } // 其他请求按原有逻辑代理 return fetch(request); } }
关键说明:
- 直接传递请求体:客户端上传的文件数据在
request.body中,它本身就是ReadableStream类型,直接传给目标API的fetch请求即可,无需额外管道转换。 - 身份验证注入:在构造目标请求时添加API所需的认证头,让客户端无需知晓认证信息,实现匿名访问。
- 响应流式返回:如果目标API返回的是大文件等流式响应,用TransformStream将响应流直接返回给客户端,避免Worker内存过载。
如果需要中途修改上传的文件数据(比如添加水印、压缩),才需要用TransformStream处理数据流,否则直接转发即可。
内容的提问来源于stack exchange,提问作者S.Richmond
相关产品推荐
相关产品推荐

