ajax接收二进制文件并转化成int,string等

二进制Ajax请求与处理
本文介绍了一种使用Ajax请求服务器二进制文件的方法,并详细展示了如何通过JavaScript处理返回的二进制数据,包括将其转换为整数和字符串。

1.  ajax请求服务器二进制文件的方法。

//二进制Ajax请求
            var xmlhttpbinary;
            //获得请求url的参数
            function GetRequest() {
                    //向服务器发送异步请求
                    xmlhttpbinary = null;
                    if (window.XMLHttpRequest) {// code for IE7, Firefox, Opera, etc.
                        xmlhttpbinary = new XMLHttpRequest();
                    }
                    else if (window.ActiveXObject) {// code for IE6, IE5
                        xmlhttpbinary = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    if (xmlhttpbinary != null) {
                        xmlhttpbinary.responseType = "blob"; //这里要用blob
                        xmlhttpbinary.onreadystatechange = blobxpr_state_Change;
                        xmlhttpbinary.open("GET", "test3.txt", true);
                        xmlhttpbinary.send(null);
                    }
                    else {
                        alert("Your browser does not support XMLHTTP.");
                    }
            }

注释:xmlhttpbinary的请求类型应该是blob

2. 接收返回的数据

function blobxpr_state_Change() {
            if (xmlhttpbinary.readyState == 4) {// 4 = "loaded"
                if (xmlhttpbinary.status == 200) {// 200 = "OK"
                    var bigblob = xmlhttpbinary.response;
                    var reader = new FileReader();
                    var smallblob;
                    smallblob = bigblob.slice(0, 22);                    
                    reader.readAsArrayBuffer(smallblob);
                    reader.onloadend = function (evt) {     //filereader加载blob成功处理函数
                        var buffer = evt.target.result;
                        //读取int                        
                        var dv = new DataView(buffer);
                        var a5 = dv.getInt32(0);
                        //读取string
                        var enc = new TextDecoder();
                        var abc = enc.decode(buffer);
                        alert("获得字符串 " + abc);
                        document.getElementById("demo").innerHTML = abc;
                    }
                }
                else {
                    alert("Problem retrieving XML data:" + xmlhttpbinary.statusText);
                }
            }
        }

注释,转int时用DataView.getInt32()函数,注意用C#转int至byte[]的顺序与getInt32()函数的顺序相反。87,100,0,0   0,0,100,87,需要注意下。C#写二进制文件时,结尾会有3个byte的莫名字符,decode()的时候需要将这3个字符去掉。

 

转载于:https://www.cnblogs.com/bwzydr/p/8432215.html

### 实现大文件上传的最佳实践 为了实现通过Ajax以Blob形式传输大文件到后端,前端和后端都需要精心设计来确保高效、稳定的数据传输。下面将详细介绍这一过程。 #### 前端部分 在前端方面,使用JavaScript中的`FileReader`对象读取文件将其转换成Blob格式。接着利用XMLHttpRequest (XHR) 或者更现代的Fetch API发送请求。考虑到大型文件可能会超出服务器设定的时间限制,推荐采用分片上传的方式减少每次请求的数据量[^2]。 ```javascript function uploadFile(file, chunkSize = 10 * 1024 * 1024 /* 10MB */) { let start = 0; const totalChunks = Math.ceil(file.size / chunkSize); function sendChunk(chunkIndex) { if (chunkIndex >= totalChunks) return; const end = ((chunkIndex + 1) * chunkSize > file.size ? file.size : (chunkIndex + 1) * chunkSize); const blob = file.slice(start, end); // 创建blob片段 fetch('/upload', { method: 'POST', headers: { "X-Chunks": `${chunkIndex}/${totalChunks}` },// 添加额外头信息用于指示当前是第几个碎片以及总共有多少个碎片 body: new FormData().append('file', blob), }).then(response => response.json()) .then(data => console.log(`Uploaded chunk ${chunkIndex}`, data)) .catch(error => console.error('Error:', error)); start += chunkSize; // 更新起始位置以便于下一次调用sendChunk函数时继续处理下一个fragment. setTimeout(() => sendChunk(++chunkIndex), 500); // 设置延迟防止过快触发网络拥塞等问题。 } sendChunk(0); } ``` 此代码段展示了如何创建一个名为`uploadFile()`的功能函数,该函数接受要上传的文件作为参数,按照指定大小分割文件为多个blobs进行逐块上传。注意这里还设置了合理的等待时间间隔以避免过多发连接造成的服务压力。 对于FormData对象,在构建HTTP POST请求体之前会自动序列化表单字段及其关联值;而设置`processData:false`与`contentType:false`则告诉jQuery不要尝试去解析提交的内容类型或编码方式,这对于二进制数据尤为重要[^4]。 #### 后端部分 后端接收这些零碎化的文件部分将它们重新组合起来。这通常涉及到保存临时文件直到所有预期的部分都到达为止。一旦确认整个文件已被成功接收到,则可以执行进一步的动作比如验证完整性或将最终版本移动到永久存储位置。 以下是基于Spring框架的一个简化版控制器示例: ```java @PostMapping("/upload") public ResponseEntity<String> handleFileUpload(@RequestPart MultipartFile file, @RequestHeader(value="X-Chunks") String chunksInfo){ try{ int currentChunk = Integer.parseInt(chunksInfo.split("/")[0]); int totalChunks = Integer.parseInt(chunksInfo.split("/")[1]); Path tempFilePath = Files.createTempFile("temp-", ".part"); Files.copy(file.getInputStream(), tempFilePath, StandardCopyOption.REPLACE_EXISTING); // 将每个接收到的小块追加到目标路径下的同一文件中... File targetFile = new File("path/to/final/file.ext"); RandomAccessFile raf = null; FileOutputStream fos = null; try { raf = new RandomAccessFile(targetFile, "rw"); long seekPosition = (long)(currentChunk - 1) * CHUNK_SIZE_IN_BYTES; raf.seek(seekPosition); byte[] buffer = Files.readAllBytes(tempFilePath); fos = new FileOutputStream(targetFile, true); fos.write(buffer); } finally { IOUtils.closeQuietly(fos); IOUtils.closeQuietly(raf); } if(currentChunk == totalChunks){ // 所有分片已全部接收完毕,此时可做校验或其他操作 return ResponseEntity.ok("Complete!"); }else{ return ResponseEntity.accepted().body(String.format("Received %d/%d", currentChunk, totalChunks)); } } catch(Exception e){ log.error(e.getMessage()); throw new RuntimeException("Failed to process uploaded part."); } } ``` 这段Java代码定义了一个RESTful Web服务端点,它能够处理来自客户端发出的一系列带有特定头部标记(即`X-Chunks`)的multipart/form-data类型的POST请求。每当一个新的文件片段被传入时,都会先存放到系统的临时目录里再逐步拼接到预设的目标地址上形成完整的副本[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值