javascript - 单击 Meteor 中的链接时下载文件

标签 javascript meteor download

我使用 https://github.com/CollectionFS/Meteor-CollectionFS 将 mp3 文件存储在我的服务器上.我想让用户只需单击链接即可下载文件,“下载”属性在这里应该可以正常工作,即:

 <a href="/cfs/files/audio/ubcq5Xev4mkQ3sv5t/file.mp3" download="file.mp3">download</a>

问题是文件正在浏览器中打开/播放,而不是开始下载到磁盘。

如此处所述 https://code.google.com/p/chromium/issues/detail?id=373182我猜这是因为跨源请求,所以我尝试按照建议的解决方案并使用此链接

<a href="#" download data-url="{{url}}" type="button" class="btn btn-default">download</a>

用这个处理器

Template.podcastItemSummary.events({
    'click a.btn-download': function(event, instance){
        event.preventDefault();            
        downloadFile($(event.currentTarget).attr('data-url'));
    }
});

if (Meteor.isClient) {
    downloadFile = function(sUrl){
        window.URL = window.URL || window.webkitURL;
        var xhr = new XMLHttpRequest();
        xhr.open('GET', sUrl, true);
        xhr.responseType = 'blob';
        xhr.onload = function(e) {
            var res = xhr.response;               
            var blob = new Blob([res], {type:"audio/mp3"});
            url = window.URL.createObjectURL(blob);
            var a = document.createElement("a");
            a.style.display = "none";
            a.href = url;            
            a.download = sUrl.split('/').pop();
            document.body.appendChild(a);
            a.click();
            window.URL.revokeObjectURL(url);
        };
        xhr.send();
    }
}

现在文件已按预期下载,但对于大文件,“点击”和开始下载之间存在奇怪的延迟。有更好的解决方案吗?

最佳答案

正如@ZuzEL 所写,解决方案是用 ?download 结束链接

<a href="/cfs/files/audio/ubcq5Xev4mkQ3sv5t/file.mp3?download" target="_parent">download</a>

我将 url 存储在一个单独的集合中,现在我意识到我应该只存储文件的 ID (ubcq5Xev4mkQ3sv5t),因为有一个设计解决方案 https://github.com/CollectionFS/Meteor-CollectionFS/wiki/How-to:-Provide-a-download-button

Template.fileList.helpers({
  files: function () {
    return Files.find();
  }
});

和模板

<template name="fileList">
  <div class="fileList">
    {{#each files}}
      <div class="file">
        <strong>{{this.name}}</strong> <a href="{{this.url download=true}}" class="btn btn-primary" target="_parent">Download</a>
      </div>
    {{/each}}
  </div>
</template>

它生成一个包含 token 的 url

<a href="/cfs/files/audio/WdBfMy2gSLRwx3XKw/file.mp3?token=eyJhdXRoVG9rZW4iOiJ2bHd6WGNoT3ktUzNoOTJUUHJnLXFMZDd6OE9yS3NHMFNkaGMwbTRKWVVUIn0%3D&amp;download=true" target="_parent">Download</a>

关于javascript - 单击 Meteor 中的链接时下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33026787/

相关文章:

java - 使用apache poi实现excel下载时如何设置excel文件的名称?

javascript - 按嵌套键对数组进行分组

javascript - 重写 jQuery 函数以与 Meteor.js 配合使用

javascript - meteor :如何导出类并在服务器上的另一个文件中使用

Perl 大容量下载直接到文件(以避免 RAM 过载)

ios - NSURLSessionDownloadTask 代表不调用 didWriteData 方法

javascript - jQuery 指定内部 html

javascript - 有或没有请求结束事件,有什么区别?

javascript - jquery xml解析查找具有特定属性的节点而不循环

javascript - meteor.js - 将单击的元素的 id 传递到集合