You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:12:53