【问题标题】:How to change a file name and download it when a button is clicked using JavaScript使用 JavaScript 单击按钮时如何更改文件名并下载文件
【发布时间】:2014-05-22 11:50:10
【问题描述】:

我在 JavaScript 中创建了一个链接到特定文件的下载按钮。

var strDownloadButton = "<br/><INPUT type="button" value="Download" onclick="add()"/>"
window.location.href = "/images/image1.jpg";

我必须在下载之前将文件image1重命名为image2,所以我使用:

<a href="/images/image1.jpg" download="image2" >Download</a> 

问题是创建了 2 个下载按钮(HTML5 下载属性创建了 1 个)。

有什么方法可以使用 JavaScript 创建的同一个按钮,并引用下载属性?

【问题讨论】:

  • 你的意思是你想下载一个图像文件到本地驱动器?
  • 是的。我可以下载图像文件,但我只想引用javascript按钮而不是再次创建新按钮..

标签: javascript html


【解决方案1】:

我不知道你在做什么 Brad Christie,

<a id="download" href="Chrysanthemum.jpg" download="image2" >Download</a>

document.getElementById("download").setAttribute("download", "image3")

在这里,您有一个要下载的元素,您获取该元素并更改其下载属性。

【讨论】:

【解决方案2】:

我不能 100% 确定它会起作用,但我之前做过类似的事情来下载资源并使用 javascript 重命名它。但是,这确实意味着资源必须与页面位于同一域中,否则您将遇到跨域安全问题。另外,请原谅我使用的是 jQuery,但如果您需要不使用,我会让您查看如何进行跨浏览器 AJAX 调用。

话虽如此:

<!-- your anchor decorated with data-saveas -->
<a href="/some/image.jpg" data-saveas="image2.jpg">Download</a>

<!-- wiring it up using jQuery/AJAX/Blob -->
<script type="text/javascript">
  // Helper to convert AJAX response in to a BLOB
  function dataToBlob(data, mimeString){
    // convert data to ArrayBuffer
    var buffer = new Int8Array(new ArrayBuffer(data.length));
    for (var i = 0; i < data.length; i++){
      buffer[i] = data.charCodeAt(i) & 0xff;
    }

    // http://stackoverflow.com/a/15302872/298053
    try {
      return new Blob([buffer],{type:mimeString});
    } catch (e1) {
      try {
        var BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder;
        if (e.name == 'TypeError' && window.BlobBuilder){
          bb = new BlobBuilder();
          bb.append([buffer.buffer]);
          return bb.getBlob(mimeString);
        } else if (e.name == 'InvalidStateError'){
          return new Blob([buffer.buffer],{type:mimeString});
        }
      } catch (e2) {
      }
    }
    return null;
  }

  // iterate over all the items that are marked as saveas
  $('a[data-saveas]').each(function(){
    var $this = $(this);

    // Get the actual path and the destined name
    var target = $this.prop('href'),
        saveas = $this.data('saveas');

    // make an ajax call to retrieve the resource
    $.ajax({
      url: target,
      type: 'GET',
      mimeType: 'text/plain; charset=x-user-defined'
    }).done(function(data, textStatus, jqXHR){
      var mimeString = jqXHR.getResponseHeader('Content-Type'),
          blob = dataToBlob(data, mimeString);
      if (blob){
        // now modfy the anchor to use the blob instead of the default href
        var filename = saveas,
            href = (window.webkitURL || window.URL).createObjectURL(blob);
        $this.prop({
          'download': saveas,
          'href': href,
          'draggable': true
        }).data({
          'downloadurl': [mimeString, filename, href].join(':')
        });
      }
    });
  });
</script>

未经测试,但应该可以工作。基本上,您可以使用 jQuery 获取资源并将其存储到具有指定名称的 blob 中。如果能够这样做,则该链接现在将成为具有所提供名称的自定义命名的 blob 资源。如果不能,则保留默认功能,用户需要自己命名。

【讨论】:

  • 感谢您的回答。你为什么用data.charCodeAt(i) &amp; 0xFF?您已经创建了 Int8Array,我认为您放入该数组的任何内容都是 8 位的。而且我不明白你为什么将流放入 Int8Array 并且不会丢失数据?
猜你喜欢
  • 2012-07-22
  • 2019-10-20
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2011-10-16
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多