java html5 blob_HTML5 Blob对象操作 - 【转载】

initUpload();

//初始化上传

function initUpload() {

var chunk = 100 * 1024; //每片大小

var input = document.getElementById("file"); //input file

input.onchange = function (e) {

var file = this.files[0];

var query = {};

var chunks = [];

if (!!file) {

var start = 0;

//文件分片

for (var i = 0; i < Math.ceil(file.size / chunk); i++) {

var end = start + chunk;

chunks[i] = file.slice(start , end);

start = end;

}

// 采用post方法上传文件

// url query上拼接以下参数,用于记录上传偏移

// post body中存放本次要上传的二进制数据

query = {

fileSize: file.size,

dataSize: chunk,

nextOffset: 0

}

upload(chunks, query, successPerUpload);

}

}

}

// 执行上传

function upload(chunks, query, cb) {

var queryStr = Object.getOwnPropertyNames(query).map(key => {

return key + "=" + query[key];

}).join("&");

var xhr = new XMLHttpRequest();

xhr.open("POST", "http://xxxx/opload?" + queryStr);

xhr.overrideMimeType("application/octet-stream");

//获取post body中二进制数据

var index = Math.floor(query.nextOffset / query.dataSize);

getFileBinary(chunks[index], function (binary) {

if (xhr.sendAsBinary) {

xhr.sendAsBinary(binary);

} else {

xhr.send(binary);

}

});

xhr.onreadystatechange = function (e) {

if (xhr.readyState === 4) {

if (xhr.status === 200) {

var resp = JSON.parse(xhr.responseText);

// 接口返回nextoffset

// resp = {

// isFinish:false,

// offset:100*1024

// }

if (typeof cb === "function") {

cb.call(this, resp, chunks, query)

}

}

}

}

}

// 每片上传成功后执行

function successPerUpload(resp, chunks, query) {

if (resp.isFinish === true) {

alert("上传成功");

} else {

//未上传完毕

query.offset = resp.offset;

upload(chunks, query, successPerUpload);

}

}

// 获取文件二进制数据

function getFileBinary(file, cb) {

var reader = new FileReader();

reader.readAsArrayBuffer(file);

reader.onload = function (e) {

if (typeof cb === "function") {

cb.call(this, this.result);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值