我尝试从Javascript下载文件。我的代码只是一个原型,但需要验证这个概念。我的服务器有62个文件(512K)。
是否可以开始下载文件,并将字节附加到当前下载文件进程。
所以我声明一个函数“上传”文件索引(i)。此函数将使用jquery延迟。
var up = function (i) {
//http://localhost/Handler/ReadFileTob64.ashx?index=0
jQuery.ajax({
url: "/Handler/ReadFileTob64.ashx?index=" + i,
type: "POST"
}).done(function (data) {
// var b = System.Convert.FromBase64String(data);
blob = b64toBlob(data, "video/mp4", 512, blob);
if (i < 61) {
up(i+1);
} else {
dfd.resolve();
}
}).fail(function (ex) {
alert(ex);
});
}
我保证我的功能,当它完成时,我创建了一个下载它的链接。
dfd.promise(up);
up(0);
up.done().then(function () {
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.download = "video.mp4";
a.href = url;
a.textContent = "video";
document.getElementById('content').appendChild(a);
});
})
实际上在这个方法中我加载blob中的所有字节(62个文件),所以我假设这些字节将存储在浏览器的内存中。
是否可以开始下载博客,并在下载过程中附加字节数?
我的完整代码.....
jQuery(document).ready(function () {
var fileType = "video/mp4";
var blob = new Blob([], { type: fileType });
var dfd = jQuery.Deferred();
var up = function (i) {
//http://localhost/Handler/ReadFileTob64.ashx?index=0
jQuery.ajax({
url: "/Handler/ReadFileTob64.ashx?index=" + i,
type: "POST"
}).done(function (data) {
// var b = System.Convert.FromBase64String(data);
blob = b64toBlob(data, "video/mp4", 512, blob);
if (i < 61) {
up(i+1);
} else {
dfd.resolve();
}
}).fail(function (ex) {
alert(ex);
});
}
dfd.promise(up);
up(0);
up.done().then(function () {
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.download = "video.mp4";
a.href = url;
a.textContent = "video";
document.getElementById('content').appendChild(a);
});
})
function b64toBlob(b64Data, contentType, sliceSize, blob) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
byteArrays.push(blob);
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
blob = new Blob(byteArrays, { type: contentType });
return blob;
}