如何使用javascript在下载时更改文件名?

如何使用javascript在下载时更改文件名?,javascript,greasemonkey,Javascript,Greasemonkey,该脚本添加了视频下载链接(在特定站点上)。下载时如何将文件名更改为其他文件名 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实现这一点,您需要设置响应头 .NET 或PHP header('Content

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

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实现这一点,您需要设置响应头

.NET

或PHP

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

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

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

下载的文件名在头文件()中设置,该头文件在服务器端创建

除非您有权访问服务器端,否则您无法在链接到的文件上使用纯javascript更改该文件(这样,您可以传递一个提供文件名的附加参数,并更改服务器端行为以设置与该文件名匹配的标题…但纯html也可以这样做,不需要javascript)。结论:Javascript对于实现您想要的东西是绝对无用的。

您可以使用userscript,但使用Greasemonkey(Firefox)Javascript是无法做到的

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

  • 添加带有Greasemonkey的链接,但使用优秀的链接下载并重命名视频

  • 按原样下载视频,并使用批处理文件、shell脚本、Python程序等重命名视频

  • 使用Greasemonkey的功能将文件发送到您控制的服务器上您自己的web应用程序。
    此服务器可以是您自己运行(或类似)的PC

  • 编写自己的Firefox插件,而不是Greasemonkey脚本。加载项具有所需的权限,Greasemonkey没有


  • 这实际上在JavaScript中是可能的,尽管浏览器的支持是不稳定的。您可以使用XHR2将文件作为Blob从服务器下载到浏览器,创建指向Blob的URL,创建其href属性设置为该URL的锚点,将下载属性设置为您想要的文件名,然后单击链接。这在GoogleChrome中有效,但我还没有验证在其他浏览器中的支持

    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();
    

    如果您正在为您的恶意下载chrome扩展寻找这样的解决方案,您应该查看chrome.downloads API,它需要额外的权限(“下载”),并允许您指定文件名


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

    因为在JavaSCript中更改文件名是不可能的,所以这个问题完全是:@Rob W,这个问题根本不是的重复。这是关于web应用程序的,这是关于客户端脚本的。OP无法控制目标页面或服务器。@Brock Adams OP要求的内容在客户端是不可能的。因此,问题转移到“如何更改特定文件的文件名”,其他用户已经多次询问该问题。@Rob W,这没有任何意义。不管怎样,这在客户端是可能的,只是不能只使用Greasemonkey JS。我很确定这是可能的。这个脚本可以做到这一点,我只是不知道如何做到:谢谢你的建议,你知道这个脚本是如何只用javascript重命名youtube上的文件的:这个脚本使用的是接近方法3的东西;使用Youtube故意在其服务器中提供的功能。请注意,下载链接都类似于:
    。该title参数告诉服务器单击链接时要发送回的文件名。大多数网站都不太好,无法提供这项服务。我无法让它工作。在Chrome中,文件以正确的名称保存,但长度为零。在Firefox中,长度是正确的,但名称是dsQ9lPaj.bin.part等。Firefox正在进行修复。预计今年第一季度会出现这种情况。
    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();