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

Cloudflare Worker通过Fetch下载文件时自定义文件名问题

解决Cloudflare Worker下载文件无文件名的问题

有两种可行方案,无需读取完整二进制响应即可实现带文件名的下载:

方案1:修改响应头添加下载文件名

Cloudflare Worker中原始响应的Header不可直接修改,你需要克隆响应体并添加Content-Disposition头,这个头会告知浏览器文件名与下载方式。

代码示例:

let file_response = await fetch(url);
// 从原URL提取文件名(若URL包含文件名)
const urlObj = new URL(url);
const fileName = urlObj.pathname.split('/').pop() || 'default-file.bin';

// 克隆响应并添加自定义头
const modifiedResponse = new Response(file_response.body, {
  status: file_response.status,
  statusText: file_response.statusText,
  headers: new Headers(file_response.headers)
});
// 添加Content-Disposition头,指定文件名
modifiedResponse.headers.set('Content-Disposition', `attachment; filename="${fileName}"`);

return modifiedResponse;

若原URL不含文件名,可直接手动指定,比如filename="my-custom-file.pdf"。

方案2:手动构建带文件名的响应(适需自定义处理二进制的场景)

如果确实需要读取二进制内容(比如修改文件内容),可先将响应转为ArrayBuffer,再构建新响应并添加头:

代码示例:

let file_response = await fetch(url);
const buffer = await file_response.arrayBuffer();
const fileName = 'custom-name.zip'; // 自定义文件名

const modifiedResponse = new Response(buffer, {
  headers: {
    'Content-Type': 'application/octet-stream',
    'Content-Disposition': `attachment; filename="${fileName}"`
  }
});

return modifiedResponse;

注意事项

  • 优先使用方案1,直接传递响应流(file_response.body)比读取整个二进制文件更节省内存、性能更优,适合大文件场景。
  • 若原响应已有Content-Disposition头但不符合需求,直接用set方法覆盖即可。

内容的提问来源于stack exchange,提问作者Rafael Spessotto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:45:37