【问题标题】:Azure blob file download linkAzure Blob 文件下载链接
【发布时间】:2013-09-07 11:49:09
【问题描述】:

我有一个存储在 Azure blob 存储中的 blob(使用开发模拟器)。

它已全部保存,我可以在 blob 存储的服务器资源管理器中看到它(如果重要,则为 file.mp3)。

然后我在我的网站中链接到它,但是当我点击链接时,我得到了 206(部分内容)(显然没有文件)。如果我右键单击保存一切正常并且文件下载。

我确定这是我想念但我看不到的东西。

【问题讨论】:

    标签: http azure azure-storage


    【解决方案1】:

    这是因为,浏览器不会下载整个媒体文件,浏览器请求的范围是 Blob 存储正确响应的一个字节和标头。这称为 HTTP 流式传输,其中部分文件将在一定范围内下载并逐步播放。在这种流媒体形式中,您可以跳过部分文件并转到结尾以播放媒体的结尾部分,而无需下载整个文件。

    假设您正在观看一部大电影,该电影大小为 100 MB。如果您想观看最后一分钟,您可以将播放器的跟踪器在时间线上向前移动,浏览器只会根据媒体文件中的时间线结构下载最后几兆字节。通常 MP4 和类似的媒体容器支持文件字节位置跟踪。

    如果可能,浏览器和大多数媒体播放器都会尝试流式传输媒体文件。

    你可以试试下面的下载属性, 参考:http://updates.html5rocks.com/2011/08/Downloading-resources-in-HTML5-a-download

    <a href="http://www.google.com/.../logo2w.png" download="MyGoogleLogo">download me</a>
    

    您可以尝试以下代码,来自这个答案,参考:Chrome extension: How to save a file on disk

    var url = window.webkitURL || window.URL || window.mozURL || window.msURL;
    var a = document.createElement('a');
    a.download = 'MyHangouts-MomentCapture.jpg';
    a.href = url.createObjectURL(dataURIToBlob(data.active, 'jpg'));
    a.textContent = 'Click here to download!';
    a.dataset.downloadurl = ['jpg', a.download, a.href].join(':');
    
    
    /**
     * Converts the Data Image URI to a Blob.
     *
     * @param {string} dataURI base64 data image URI.
     * @param {string} mimetype the image mimetype.
     */
    var dataURIToBlob = function(dataURI, mimetype) {
      var BASE64_MARKER = ';base64,';
      var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
      var base64 = dataURI.substring(base64Index);
      var raw = window.atob(base64);
      var rawLength = raw.length;
      var uInt8Array = new Uint8Array(rawLength);
    
      for (var i = 0; i < rawLength; ++i) {
        uInt8Array[i] = raw.charCodeAt(i);
      }
    
      var bb = new this.BlobBuilder();
      bb.append(uInt8Array.buffer);
      return bb.getBlob(mimetype);
    };
    

    【讨论】:

    • 有没有办法让它下载整个文件,我想要一个音频文件的保存链接,以便人们稍后播放。我也理解如果播放器正在读取这个文件这是如何工作的,但是为什么浏览器实际上不下载文件(它也不播放它),Chrome 肯定理解流媒体?
    • 如果可能,浏览器总是根据扩展名首先流式传输,因为扩展名是 mp3,浏览器会自动将其加载到自己的播放器中。但是您可以使用 FileAPI 和 XMLHttpRequest 将文件保存在磁盘上,但这太多了 javascript 并且在旧 IE 版本中也不起作用。
    • 我已经用可能的解决方案更新了答案。您必须解决它们才能使其正常工作。
    • 下载标签在 IE10 + chrome 中运行良好,这很好。谢谢:)
    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 2015-12-06
    • 2017-08-20
    • 2021-01-04
    • 1970-01-01
    • 2021-12-08
    • 2011-10-08
    相关资源
    最近更新 更多