如何在下载文件之前更改文件扩展名?

3

我有一个视频文件被托管在这里:

https://cdn.shopify.com/s/files/1/0664/3037/0044/files/video

目前,该视频文件没有任何扩展名。使用Javascript,如何下载并将其更名为 [filename].mp4 再进行下载。

我尝试了以下方法,但它会下载不带扩展名的文件。

function downloadURI(uri, name) {
  var link = document.createElement("a");
  link.download = name;
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  delete link;
}



downloadURI("https://cdn.shopify.com/s/files/1/0664/3037/0044/files/video", "video.mp4");


1
为什么您不能在A标签上使用“download”属性?这只是用于重命名吗?直接从Java访问文件系统是可能的(在Chrome中),但需要一些操作。 - ControlAltDel
"download仅适用于同源URL或blob:和data:方案。" 和 "如果Content-Disposition头与下载属性具有不同的信息,则结果行为可能会有所不同:如果头指定文件名,则优先于下载属性中指定的文件名。" https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download - Cagri
2个回答

2

https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/a#attr-download

download 属性仅适用于同源 URL,或者 blob:data: 方案。如果 Content-Disposition 头信息与 download 属性提供的信息不同,则结果行为可能会有所不同:

如果头信息指定了文件名,则它优先于 download 属性中指定的文件名。
如果头信息指定了内联(inline)的处理方式,则 Chrome 和 Firefox 会将属性视为下载并予以优先处理。旧版 Firefox(82 版本之前)会优先处理头信息,并在浏览器中直接显示内容。

我在不同的域上尝试了你的代码,但它只是重定向到该 URL,而没有进行下载操作,这是因为它没有发送 Content-Disposition。看起来你是在不同的域上测试,因此它会忽略 download 并重定向到文件链接,而你的浏览器配置为下载它。我的浏览器配置为自动播放视频。

然而,我发现你提供的 URL 具有 CORS *,这意味着任何来源都可以访问它。因此,你可以下载文件并创建一个 blob,然后将其发送到浏览器进行下载。

function downloadURI(uri, name) {
   fetch(uri).then((response) => response.blob())
   .then((blobresp) => {
       var blob = new Blob([blobresp], {type: "octet/stream"});
       var url = window.URL.createObjectURL(blob);

       var link = document.createElement("a");
       link.download = name;
       link.href = url;
       document.body.appendChild(link);
       link.click();
       document.body.removeChild(link);
       delete link;
   })
}

downloadURI("https://cdn.shopify.com/s/files/1/0664/3037/0044/files/video", "video.mp4");

那么,如果URL没有CORS *,就无法从服务器获取响应吗? - Ganesh Adhikari
@GaneshAdhikari 是的,如果它没有适当的“Access-Control-Allow-Origin”,你就无法从JavaScript访问它。另一种选择是编写一个服务器端代理。 - Cagri

0

const myRenamedFile = new File([myFile], 'my-file-final-1-really.txt');

这段代码摘自一个网站,可能比我更好地解释了它:

https://pqina.nl/blog/rename-a-file-with-javascript/

另外,似乎有很多API或Node JS可以管理这个。这将允许您在下载后将文件重命名为本地文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接