打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用JavaScript或jQuery拆分文件

我需要上传文件的一部分(只有第一个MB).我已经创建了一个上传整个文件的PHP脚本.数据(formData Object)由ajax调用传递.

我的想法是现在用javascript(jquery)拆分文件.我的请求有什么解决方案吗?

当前代码:

function start(a){    //var fSize = $('#fileUpload')[0].files[0].size / 1024;    var formData = new FormData();        formData.append( 'fileUpload', $('#fileUpload')[0].files[0] );    //AJAX    $.ajax({        url: 'script.php',        type: 'POST',        data: formData,        processData: false,        contentType: false,        success: function(msg){            alert("Win: "   msg);        },        error: function(bla, msg){            alert("Fail: "   msg);        }    });}

解决方法:

由于您使用的是FormData,这是一项相当新的技术,我将向您展示一些新技术.

首先,使用FileReader对象读取文件:

var fr = new FileReader(), buf, file = $('#fileUpload')[0].files[0];fr.onload = function(e) {    buf = new Uint8Array(e.target.result);};fr.readAsArrayBuffer(file);

然后,您可以为每个拆分部分创建一个Blob(每个1e6字节长):

for (var i = 0, blobs = []; i < buf.length; i  = 1e6)    blobs.push(new Blob([buf.subarray(i, i   1e6)]));

最后,您可以将所有Blob添加到FormData对象:

var formData = new FormData();for (var i = 0; i < blobs.length; i  )    formData.append("slice"   i, blobs[i], file.name   ".part"   i);

你应该没事.不过,我还没有测试过.

我对表现一无所知.您也可以使用fr.readAsBinaryString,从而使e.target.result成为一个字符串.这样,您可以使用简单的substring / slice / substr / whatever创建Blob,但我担心Unicode字符和诸如此类的东西可能存在一些问题.另外,也许它更慢.

将所有内容放在更连贯的代码段中:

$('#fileUpload').change(function() {    // If no file is selected, there's nothing to do    if (!this.files.length) return;    var fr = new FileReader(), file = this.files[0];    fr.onload = function(e) {        splitAndSendFile(new Uint8Array(e.target.result), file);    };    fr.readAsArrayBuffer(file);};function splitAndSendFile(dataArray, file) {    var i = 0, formData, blob;    for (; i < dataArray.length; i  = 1e6) {        blob = new Blob([dataArray.subarray(i, i   1e6)]);        formData = new FormData();        formData.append("fileUpload", blob, file.name   ".part"   (i / 1e6));        $.ajax({            url: 'script.php',            type: 'POST',            data: formData,            processData: false,            contentType: false,            success: function(msg){                alert("Win: "   msg);            },            error: function(bla, msg){                alert("Fail: "   msg);            }        });    }}

注意:FormData.append采用第三个可选参数,如果是File或Blob值,则该参数应该是文件的名称.如果未指定,Blob可能会获得不可预测的随机文件名.

可能该参数不是标准的,并且在MDN artice中没有提及,但我在上面的代码片段中使用过它.无论如何,如果你知道你在做什么,你可以有几个选项来指定文件名.例如,使用formData.append(“filename”,file.name)或在请求中发送自定义标头.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
在浏览器端用H5实现图片压缩上传
File、FileReader、Blob、Fromdata对象
input type=file实现图片上传,预览以及图片删除
文件各种上传,离不开的表单
关于fromdata的上传文件问题
异步更换后台生成的二维码
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服