Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript gzip表单输入文件_Javascript_Jquery_Servlets_Compression - Fatal编程技术网

Javascript gzip表单输入文件

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); //

我对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); // 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,所以我认为将它们基于同一个包会很有用