js 接收服务器返回的二进制流文件,保存并转成文件

接到一个新需求,从某一个服务器返回一个二进制流文件,然后要保存起来上传到另一个服务器。无需用户手动上传。
实现过程及分析过程如下:
新版本的XMLHttpRequest对象可以获取服务器端的二进制数据,方法如下:
XMLHttpRequest对象的其中一个属性responseType,是一个用于定义响应类型的枚举值。详细值如下表格所示,
而xhr另一个属性response则是返回一个 ArrayBuffer、Blob、Document,或 DOMString,具体是哪种类型取决于 XMLHttpRequest.responseType 的值。其中包含整个响应实体

数据类型
‘’DOMString (这个是默认类型)
arraybufferArrayBuffer对象
blobBlob对象
documentDocument对象
jsonJS 对象 , 解析得到的从服务器返回来的JSON字符串
textDOMString

一般情况下都是接收文本数据,而我们要接收服务器的二进制流文件,则需要把responseType定义为blob类型。如下

  var xhr = new XMLHttpRequest();
 xhr.open('GET', URL,true);
 xhr.responseType = 'blob';

接收数据则需要使用浏览器自带的Blob对象进行接收。

var blob = new Blob([xhr.response]);

这就完成了接收工作,下一步就是把bolb数据转成文件,key.DSP为文件名

var file = new window.File([blob], 'key.DSP', {type: 'blob'}),

那么最后就可以根据自己拿到的文件完成业务代码即可

  var fd = new FormData();
  fd.append("file",file);
  updateFile(fd);//上传文件
  Download(xhr.response,'key.DSP');//下载文件(当然直接访问服务器返回的二进制流文件即可成功下载

如果是下载该文件,可通过以下方法实现:

function Download(content, filename) {
    var eleLink = document.createElement('a');
    eleLink.download = filename;
    eleLink.style.display = 'none';
    // 字符内容转变成blob地址
    var blob = new Blob([content]);
    eleLink.href = URL.createObjectURL(blob);
    // 触发点击
    document.body.appendChild(eleLink);
    eleLink.click();
    // 然后移除
    document.body.removeChild(eleLink);
};

附上开发该需求的过程中遇到的一个问题,当然不是很常用,一般情况下,我们都是发起异步请求。当时,当我们把xhr.open(‘GET’, URL,true)的第三个参数设置为false的时候,表示请求是同步的。
当XMLHttpRequest不是异步(即同步)时,responseType属性不能设置。因此不能采用以上方法,则需要使用以下方法。

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, false); 
    xhr.overrideMimeType("text/plain; charset=x-user-defined");
    xhr.send(null);
    
    var data;
    if (xhr.status === 200) {
        data = stringToArrayBuffer(xhr.response);
    } 
    
    // ...
    
    function stringToArrayBuffer(str) {
        var buf = new ArrayBuffer(str.length);
        var bufView = new Uint8Array(buf);
    
        for (var i=0, strLen=str.length; i<strLen; i++) {
            bufView[i] = str.charCodeAt(i);
        }
    
        return buf;
    }

这样data也就能获取到服务器发过来的二进制流数据了。

在 JavaScript 中实现上传二进制文件的接口,一般步骤如下: 1. 获取文件对象:使用输入类型为文件的 HTML 元素(如<input type="file">)或拖放上传功能,获取用户选择的文件对象。 2. 创建 XMLHttpRequest 对象:使用 JavaScript 中的 XMLHttpRequest 对象,创建与服务器的通信。 3. 设置请求参数:使用 XMLHttpRequest 对象的 open 方法,指定上传方法(如POST)、URL 和是否异步执行等参数。 4. 设置请求头信息:使用 XMLHttpRequest 对象的 setRequestHeader 方法,设置请求头信息,包括文件类型、文件名等。 5. 监听上传进度:使用 XMLHttpRequest 对象的 upload.onprogress 事件,实时获取上传进度。 6. 监听上传结果:使用 XMLHttpRequest 对象的 onload 和 onerror 事件,分别监听上传成功和失败的结果。 7. 发送请求:使用 XMLHttpRequest 对象的 send 方法,将二进制文件发送至服务器。 8. 处理上传结果:在 onload 事件监听函数中,根据服务器返回的响应数据进行相应的处理,如显示上传成功信息或错误提示。 以下是一个简单的示例代码: ```javascript function uploadFile(file) { var xhr = new XMLHttpRequest(); xhr.open("POST", "/upload", true); xhr.setRequestHeader("Content-Type", file.type); xhr.setRequestHeader("Content-Disposition", "attachment; filename=" + file.name); xhr.upload.onprogress = function(event) { if (event.lengthComputable) { var percentage = Math.round((event.loaded / event.total) * 100); console.log("Progress: " + percentage + "%"); } }; xhr.onload = function() { if (xhr.status === 200) { console.log("File uploaded successfully."); } else { console.log("Upload failed. Error code: " + xhr.status); } }; xhr.onerror = function() { console.log("Upload failed. Please try again later."); }; xhr.send(file); } ``` 以上代码仅为示例,具体实现需根据具体业务需求进行调整和完善。同时,在服务器端也需要相应的接口和处理逻辑来接收保存上传的二进制文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VIVI Xiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值