我如何改变一个文件名下载与javascript

How do I change a filename on-download with javascript?

本文关键字:文件名 一个 下载 javascript 改变 何改变      更新时间:2023-09-26

脚本添加了视频下载链接(在特定网站上)。如何在下载时将文件名更改为其他内容?

Example URL:
"http://website.com/video.mp4"
Example of what I want the filename to be saved as during download:
"The_title_renamed_with_javascript.mp4"

这实际上是可以用JavaScript,虽然浏览器支持将参差不齐。您可以使用XHR2将文件作为Blob从服务器下载到浏览器,创建Blob的URL,创建锚并将其href属性设置为该URL,将下载属性设置为您想要的文件名,然后单击链接。这可以在Google Chrome中工作,但我还没有验证在其他浏览器中的支持。

window.URL = window.URL || window.webkitURL;
var xhr = new XMLHttpRequest(),
      a = document.createElement('a'), file;
xhr.open('GET', 'someFile', true);
xhr.responseType = 'blob';
xhr.onload = function () {
    file = new Blob([xhr.response], { type : 'application/octet-stream' });
    a.href = window.URL.createObjectURL(file);
    a.download = 'someName.gif';  // Set to whatever file name you want
    // Now just click the link you created
    // Note that you may have to append the a element to the body somewhere
    // for this to work in Firefox
    a.click();
};
xhr.send();

你不能在客户端JavaScript中这样做,你需要设置响应头…

。净

Response.AddHeader("Content-Disposition", "inline;filename=myname.txt")
PHP

header('Content-Disposition: inline;filename=myname.txt')

也可在您选择的其他服务器端语言中使用。

下载文件名设置在服务器端创建的页眉中(看一下"Content-Disposition")。

没有办法你可以改变与纯javascript上的文件,你链接到,除非你有访问服务器端(这样你可以传递一个额外的参数给出文件名和改变服务器端行为设置头匹配…但这也可能与纯html,不需要javascript)。总结:Javascript对于实现你想要的东西是绝对无用的。

您可以可能使用Chrome userscript完成此操作,但它不能(目前)使用Greasemonkey (Firefox) javascript完成。

变通方法(从最简单到最难):

  1. 使用Greasemonkey添加链接,但使用优秀的DownThemAll!

  2. 按原样下载视频,并使用批处理文件、shell脚本、Python程序等来重命名它们。

  3. 使用Greasemonkey的GM_xmlhttpRequest() Doc函数将文件发送到您控制的服务器上的web应用程序。
    该服务器可以是运行XAMPP(或类似)的您自己的PC。

  4. 编写您自己的Firefox插件,而不是Greasemonkey脚本。add -on具有所需的权限,Greasemonkey没有

当然,您将无法从客户端本身正确执行此操作。您可以首先将文件上传到具有所需名称的服务器上,然后将其返回给最终用户(在这种情况下将使用您的文件名)。

万一你正在寻找这样一个解决方案为您讨厌的下载chrome扩展,你应该看看chrome。下载API,它需要额外的权限('downloads'),并允许你指定文件名。https://developer.chrome.com/extensions/downloads

然而,我现在面临一个问题。我正在重构的chrome扩展有600k+用户群,添加一个新的权限将禁用所有扩展。所以这对我来说是不去的解决方案,但如果你正在开发一个新的扩展,你绝对应该使用它。