Javascript gzip表单输入文件
我对javascript/web编程非常陌生。我上传表单的主要用途是csv文件。我已经在使用pako来gzip我的json(在请求url中) 在将文件发送到服务器之前,我如何gzip这些文件 这大致就是我构造formdata的方式Javascript gzip表单输入文件,javascript,jquery,servlets,compression,Javascript,Jquery,Servlets,Compression,我对javascript/web编程非常陌生。我上传表单的主要用途是csv文件。我已经在使用pako来gzip我的json(在请求url中) 在将文件发送到服务器之前,我如何gzip这些文件 这大致就是我构造formdata的方式 $.each($("input[type=file]"), function(i, obj) { $.each(obj.files, function(j, file) { formData.append(obj.name, file); //
$.each($("input[type=file]"), function(i, obj) {
$.each(obj.files, function(j, file) {
formData.append(obj.name, file); // we need to gzip the data
})
});
Edit1:我已经设法(我认为)使用pako来gzip文件,但是有一个问题——异步问题。这是我的新代码:
$.each($("input[type=file]"), function(i, obj) {
$.each(obj.files, function(j, file) {
formData.append(obj.name, file); // we need to gzip the data
var r = new FileReader();
r.onload = function(){
var zippedResult = pako.gzip(r.result);
var oMyBlob = new Blob(zippedResult, {type : file.type}); // the blob
formData.append(obj.name, oMyBlob); // we need to gzip the data
};
r.readAsArrayBuffer(file);
})
});
// Time to send the formData!
$.ajax({......
正如您所看到的,由于onload函数只在ajax执行之后运行,所以formData是空的
edit2:我正在尝试为输入文件创建一个onchange事件,所以这就是我到目前为止想到的。但有一个问题-它似乎没有正确的拉链。数据类型问题
$("input[type=file]").change(function (event){
var fileList = this.files;
$.each(fileList,function(i,file){
var r = new FileReader();
r.onload = function(){
var zippedResult = pako.gzip(r.result);
var oMyBlob = new Blob(zippedResult, {type : file.type});
app.formData.append(event.target.name, oMyBlob, file.name);
};
r.readAsArrayBuffer(file);
});
});
这就是我所做的-注意formData是一个全局变量。请注意,在提交表单数据时要清除表单数据,否则表单数据将不断增加。另外,如果您重新选择一个文件,它将被附加到表单上(这可能不是您想要的)-我还没有找到解决方法
$("input[type=file]").change(function (event){
var fileList = this.files;
$.each(fileList,function(i,file){
var r = new FileReader();
r.onload = function(){
var convertedData = new Uint8Array(r.result);
// Zipping Uint8Array to Uint8Array
var zippedResult = pako.gzip(convertedData, {to : "Uint8Array"});
// Need to convert back Uint8Array to ArrayBuffer for blob
var convertedZipped = zippedResult.buffer;
var arrayBlob = new Array(1);
arrayBlob[0] = convertedZipped;
// Creating a blob file with array of ArrayBuffer
var oMyBlob = new Blob(arrayBlob , {type : file.type} ); // the blob (we need to set file.type if not it defaults to application/octet-stream since it's a gzip, up to you)
app.formData.append(event.target.name, oMyBlob, file.name); // we need to gzip the data
};
r.readAsArrayBuffer(file);
});
});
我已经将gzip添加到JSZip中 JSZip设计得更好,能够以分块/流模式处理大文件。我不认为只有pako一个人能做到这一点。我在我的项目中同时使用ZIP文件和gzip,所以我认为将它们基于同一个包会很有用