如何使用Google Drive Javascript API更新Google云端硬盘中的zip文件

时间:2018-05-17 07:33:31

标签: javascript google-drive-api zip

我对文件压缩和谷歌驱动器API没有经验。在我的项目中,我使用的是zip.js和Google Drive Api。 zip.js运行良好,因为我直接下载生成的zip文件,我的设备可以解压缩它。虽然我没有在zip的内容中添加任何额外的数据,但zip文件大小已更改(加倍),并且在更新时已损坏。

我的生成zip文件的功能:

function createZip(data,fileName,callback){
    var blob = new Blob([ data ], {
      type : "text/xml"
    });

    zipBlob(fileName, blob, function(zippedBlob){
        console.log(zippedBlob)
        // saveAs(zippedBlob,"test.zip") //this test.zip is a valid file.
        var reader = new FileReader();
        reader.addEventListener("loadend", function() {
           // reader.result contains the contents of blob as a typed array
           console.log(reader.result);
           callback(reader.result);
        });
        reader.readAsText(zippedBlob)
    })


    function zipBlob(filename, blob, callback) {
      zip.createWriter(new zip.BlobWriter("application/zip"), function(zipWriter) {
        zipWriter.add(filename, new zip.BlobReader(blob), function() {
          zipWriter.close(callback);
        });
      }, function(error){
        console.error(error)
      });
    }
}

我的更新文件的功能:

this.updateFile = function(id, text, accessToken, callback) {
    var boundary = '-------314159265358979323846',
        delimiter = "\r\n--" + boundary + "\r\n",
        close_delim = "\r\n--" + boundary + "--",
        mimeType = 'application/zip';

    var multipartRequestBody =
        delimiter + 'Content-Type: application/json\r\n\r\n' +
        delimiter + 'Content-Type:' + mimeType + '\r\n\r\n' +
        text +
        close_delim;

    gapi.client.request({
        'path': '/upload/drive/v3/files/'+id,
        'method': 'PATCH',
        'params': { 'uploadType': 'multipart' },
        'headers': { 'Content-Type': 'multipart/mixed; boundary="' + boundary + '"', 'Authorization': 'Bearer ' + accessToken, },
        'body': multipartRequestBody
    }).execute(function(file) {
        if (typeof callback === "function") callback(file);
    }, function(error) {
        console.error(error)
        callback(error);
    });
}

我想知道FileReader是否会破坏内容,因为reader.result与zip的原始内容不同。我使用此函数来读取文件内容:

this.readFile = function(fileId, callback) {
    var request = gapi.client.drive.files.get({
        fileId: fileId,
        alt: 'media',
        Range : 'bytes=100-200'
    })
    request.then(function(response) {
        console.log(response);
        if (typeof callback === "function") callback(response.body);
    }, function(error) {
        console.error(error)
    })
    //return request;
}

zip的原始内容为文本:

PKÊL    PV-A2.xmlUXñçûZÂÌZùì½m,I÷]þC£?I@ÌNøK¼=F °KÃ(­«Ýgz=Crçß+²ne§y¸¥U6... (some thousands characters more)

文件阅读器内容为文本:

PK�U�L  PV-A2.xml�]�<��w�O1�+(���� �@�6`@+  �Ґ`��r��EÑ�������̊s"���0�..(some thousands characters more)

从zip文件中获取base64数据(记得将data:application/zip;base64,删除):

    // saveAs(zippedBlob,"test.zip") //this test.zip is a valid file.
    var reader = new FileReader();
    reader.addEventListener("loadend", function() {
       // reader.result contains the contents of blob as a typed array
       callback(reader.result.replace("data:application/zip;base64,",""));
    });
    reader.readAsDataURL(zippedBlob)

Content-Transfer-Encoding: base64添加到multipartRequestBody并改为使用base64内容。

var multipartRequestBody =
    delimiter + 'Content-Type: application/json\r\n\r\n' +
    delimiter + 'Content-Type:' + mimeType + '\r\n' +
    'Content-Transfer-Encoding: base64\r\n\r\n' +
    base64Data +
    close_delim;

1 个答案:

答案 0 :(得分:1)

如果text是转换为base64的zip文件,那么这个修改怎么样?我认为你的脚本几乎是正确的。作为修改,它使用Content-Transfer-Encoding来提供文件的编码方法。

来自:

delimiter + 'Content-Type:' + mimeType + '\r\n\r\n' +
text +

致:

delimiter + 'Content-Type: ' + mimeType + '\r\n' + // Modified
'Content-Transfer-Encoding: base64\r\n\r\n' + // Added
text +

注意:

  • 在我的环境中,我确认使用您的脚本会出现与您的情况相同的错误。此外,我确认当此修改反映到您的脚本时,zip文件会更新,并且文件可以解压缩。

但如果这不是你情况的解决方案,我很抱歉。