简体   繁体   English

使用Javascript下载BIM360 Docs文件

[英]Download BIM360 Docs file using Javascript

I am trying to download BIM360 docs files using javascript. 我正在尝试使用JavaScript下载BIM360文档文件。 I am able to get file response from BIM360 but unable to save file with proper content. 我能够从BIM360获得文件响应,但无法保存具有适当内容的文件。 Here is my JS code - 这是我的JS代码-

$(document).ready(function () {
    var anchor = $('.vcard-hyperlink');
    $.ajax({
        url: <file downloaded URL>,
        type: "GET",
        headers: {
            "Authorization": "Bearer " + <accessToken>
        },
        beforeSend: function (jqxhr) {

        },
        success: function (data) {
            // create a blob url representing the data
            var blob = new Blob([data]);
            var url = window.URL.createObjectURL(blob);
            // attach blob url to anchor element with download attribute
            var anchor = document.createElement('a');
            anchor.setAttribute('href', url);
            anchor.setAttribute('download', "test.docx");
            anchor.click();
            window.URL.revokeObjectURL(url);

        },
        error: function (jqxhr, textStatus, errorThrown) {
            console.log(textStatus, errorThrown)
        }
    });
});

To download files from BIM360 service, I used a custom Ajax transports of the jQuery to creates new XMLHttpRequest and passes all the received data back to the jQuery, see here for the detail of the Ajax transports with jQuery. 为了从BIM360服务下载文件,我使用了jQuery的自定义Ajax传输来创建新的XMLHttpRequest并将所有接收到的数据传递回jQuery,请参阅此处以获取有关jQuery的Ajax传输的详细信息。

/**
 *
 * jquery.binarytransport.js
 *
 * @description. jQuery ajax transport for making binary data type requests.
 * @version 1.0 
 * @author Henry Algus <henryalgus@gmail.com>
 *
 */
// use this transport for "binary" data type
$.ajaxTransport("+binary", function(options, originalOptions, jqXHR) {
    // check for conditions and support for blob / arraybuffer response type
    if (window.FormData && ((options.dataType && (options.dataType == 'binary')) || (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || (window.Blob && options.data instanceof Blob))))) {
        return {
            // create new XMLHttpRequest
            send: function(headers, callback) {
                // setup all variables
                var xhr = new XMLHttpRequest(),
                    url = options.url,
                    type = options.type,
                    async = options.async || true,
                    // blob or arraybuffer. Default is blob
                    dataType = options.responseType || "blob",
                    data = options.data || null,
                    username = options.username || null,
                    password = options.password || null;

                xhr.addEventListener('load', function() {
                    var data = {};
                    data[options.dataType] = xhr.response;
                    // make callback and send data
                    callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders());
                });

                xhr.open(type, url, async, username, password);

                // setup custom headers
                for (var i in headers) {
                    xhr.setRequestHeader(i, headers[i]);
                }

                xhr.responseType = dataType;
                xhr.send(data);
            },
            abort: function() {
                jqXHR.abort();
            }
        };
    }
});

The following code snippet is the code I used for downloading a file from BIM360 bucket via Forge Data Management API. 以下代码段是我用于通过Forge数据管理API从BIM360存储桶下载文件的代码。 With the above custom Ajax transports and dataType: 'binary' , the API response will be processed as a blob. 使用上面的自定义Ajax传输和dataType: 'binary' ,API响应将作为blob处理。 Afterward, we just need to create a blob URL and a temporary HTML link to open the blob URL for saving the downloaded file. 之后,我们只需要创建一个Blob URL和一个临时HTML链接即可打开Blob URL,以保存下载的文件。

To obtain the actual file storage URL, you have to call API GET Item Versions , and the download link is the value of the storage.meta.link.href attribute of each item version data in the API response. 要获取实际的文件存储URL,必须调用API GET Item Versions ,并且下载链接是API响应中每个项目版本数据的storage.meta.link.href属性的值。

$(function() {

  $('a#download').click(function(event) {
    event.preventDefault();

    const filename = '2f536896-88c8-4dee-b0c1-cdeee231a028.zip';

    const settings = {
      crossDomain: true,
      url: 'https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/' + filename,
      method: 'GET',
      dataType: 'binary',
      processData: false,
      headers: {
        Authorization: 'Bearer YOUR_ACCESS_TOKEN',
        Content-Type: 'application/octet-stream'
      }
    };

    $.ajax(settings).done(function (blob, textStatus, jqXHR) {
        console.log(blob );
        console.log(textStatus);

      if( navigator.msSaveBlob )
        return navigator.msSaveBlob(blob, filename);

      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.style = 'display: none';
      document.body.appendChild(a);

      a.href = url;
      a.download = filename;
      a.click();
      URL.revokeObjectURL(url);
    });
  });
})

Hope it helps. 希望能帮助到你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM