【问题标题】:Drive REST API - jquery multipart file uploadDrive REST API - jquery 多部分文件上传
【发布时间】:2016-04-23 05:03:00
【问题描述】:

我需要将文件从浏览器上传到我的 Google 云端硬盘。这是我的上传代码:(files 是从<input type="file"> 获取的文件数组)

      var boundary = "foo_bar_baz";
      const delimiter = "\r\n--" + boundary + "\r\n";
      const close_delim = "\r\n--" + boundary + "--";

      var contentType = doc.mimeType;
      var metadata = {
        "title": doc.name,
        "mimeType": doc.mimeType
      };

      var reader = new FileReader();

      reader.onload = function(e){

        var multipartRequestBody =
          delimiter +  'Content-Type: application/json\r\n\r\n' +
          JSON.stringify(metadata) +
          delimiter + 'Content-Type: ' + contentType + '\r\n' + '\r\n' +
          e.target.result +
          close_delim;

        $.ajax({
          url: 'https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart',
          type: 'POST',
          headers: {
            "Authorization": 'Bearer ' + luminDriveAccessToken,
            "Content-Type": 'multipart/related; boundary="'+ boundary + '"'
          },
          success: function() {
            console.log('>>> Done uploading.');
          },
          error: _handleUploadErrors,
          data: multipartRequestBody,
          cache: false,
          contentType: false,
          processData: false,
          crossDomain: true
        });
      };

      reader.readAsBinaryString(files[0]);

当我运行此脚本时,文件已上传到我的 Google Drive(正确的标题,正确的 mimeType),但文件内容已损坏(Google Drive 无法打开它)。当我将文件下载到我的计算机时,我也无法打开它,并且 我意识到下载的文件的大小比原始文件的大小略大 (例如 .docx 文件: 15.4KB 与 11.3KB 相比)。
所以我猜这个问题与发送到服务器之前的文件内容有关。但我还不知道如何修复它。希望大家帮忙!

【问题讨论】:

标签: jquery google-drive-api multipart


【解决方案1】:

我通过将阅读器的结果转换为 base64Data 找到解决方案,然后将 Content-Transfer-Encoding: base64 添加到请求的正文中。

reader.onload = function(e){
        var base64Data = btoa(e.target.result);
        var multipartRequestBody =
          delimiter +  'Content-Type: application/json\r\n\r\n' +
          JSON.stringify(metadata) +
          delimiter + 'Content-Type: ' + contentType + '\r\n' +
          'Content-Transfer-Encoding: base64\r\n' + '\r\n' +
          base64Data + close_delim;

        $.ajax({
          url: 'https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart',
          type: 'POST',
          headers: {
            "Authorization": 'Bearer ' + ACCESS_TOKEN,
            "Content-Type": 'multipart/related; boundary="'+ boundary + '"'
          },
          success: function() {
            // TODO XIN
            console.log('>>> DONE');
          },
          error: _handleUploadErrors,
          data: multipartRequestBody,
          cache: false,
          contentType: false,
          processData: false,
          crossDomain: true
        });
      };

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 2021-02-04
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多