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

能否在URL.createObjectURL中指定路径?生成带自定义文件名的Blob URL

问题解答

直接生成localhost:8000/随机系统UUID/myDocument.pdf格式的Blob URL是做不到的——浏览器生成的Blob URL固定以blob:开头,格式为blob:<origin>/<uuid>,这是浏览器的安全机制决定的,用来明确区分本地Blob资源和服务器托管资源,无法自定义路径结构或后缀。

但可以通过Service Worker实现类似的URL效果,不需要在服务器创建实际文件,具体实现步骤如下:

实现思路

利用Service Worker拦截浏览器发起的特定路径请求,当请求匹配你想要的/随机UUID/myDocument.pdf格式时,直接返回本地的PDF Blob数据,模拟出服务器路径的效果。

代码实现

1. 主页面代码

// 注册Service Worker
async function registerSW() {
  if ('serviceWorker' in navigator) {
    await navigator.serviceWorker.register('/sw.js');
  }
}

// 准备PDF Blob数据
const blob = new Blob([data.body], { type: 'application/pdf' });
// 生成随机UUID作为文档标识
const docId = crypto.randomUUID();

// 将Blob存入Cache API,供Service Worker读取
async function storeBlob(docId, blob) {
  const cache = await caches.open('local-pdfs');
  await cache.put(`/${docId}/myDocument.pdf`, new Response(blob));
}

// 执行注册、存储并打开自定义URL
async function openCustomPdfUrl() {
  await registerSW();
  await storeBlob(docId, blob);
  window.open(`/${docId}/myDocument.pdf`, '_blank', 'noopener');
}

openCustomPdfUrl();

2. Service Worker文件(sw.js)

self.addEventListener('fetch', (event) => {
  // 匹配 /<UUID>/myDocument.pdf 格式的请求
  const targetPattern = /^\/[0-9a-f-]+\/myDocument\.pdf$/i;
  if (targetPattern.test(new URL(event.request.url).pathname)) {
    event.respondWith(
      caches.match(event.request).then(response => {
        return response || new Response('文档不存在', { status: 404 });
      })
    );
  }
});

注意事项

  • Service Worker需要在HTTPS环境下运行(本地localhost开发环境不受此限制)。
  • 可以在不需要文档时,调用caches.delete('local-pdfs')或具体缓存项来清理存储空间,避免冗余占用。

内容的提问来源于stack exchange,提问作者Keshav Agrawal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:55:18