使用gapi将文件上传到Google云端硬盘

罗宾·霍迪

我已经按照本文以及关于将文件上传到包含元数据的Google云端硬盘的SO解答进行了跟踪,得到了以下代码:

readonly BOUNDARY = '--4561564891651634213217'; //Randomly mashed in numbers

uploadToDrive(file: File /*<input type="file">.files[0]*/, fileName: string) {
    this.readFile(file)
        .then(base64File => {
          gapi.client.request({
            path: 'upload/drive/v3/files', method: 'POST', params: {
              uploadType: 'multipart'
            }, headers: {
              'Content-type': `multipart/related; boundary=${this.BOUNDARY}`,
              'Content-length': file.size
            }, body: this.formatMultipartBody(file, fileName, base64File)
          })
              .then(response => console.log('Upload success! ', response), error => console.error('Upload error! ', error));
        });
  }

private readFile(file: File): Promise<string> {
    const fileReader: FileReader = new FileReader();
    return new Promise(resolve => {
      fileReader.readAsBinaryString(file);
      fileReader.onload = (event: any) => resolve(btoa(fileReader.result));
    });
  }

private formatMultipartBody(file: File, fileName: string, base64File: string) {
    const delimiter = `\r\n--${this.BOUNDARY}\r\n`;
    const closeDelimiter = `\r\n--${this.BOUNDARY}--`;
    const metadata = {
      name: fileName, mimeType: file.type || 'application/octet-stream'
    };
    const body = `
    ${delimiter}
    Content-Type: application/json; charset=UTF-8\r\n\r\n
    Content-Transfer-Encoding: base64
    ${JSON.stringify(metadata)}
    ${delimiter}
    Content-Type: ${file.type || 'application/octet-stream'}\r\n
    ${base64File}
    ${closeDelimiter}
    `;
    return body;
  }

无论我上传哪种文件,我都会收到以下错误消息:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "badContent",
    "message": "Unsupported content with type: application/octet-stream"
   }
  ],
  "code": 400,
  "message": "Unsupported content with type: application/octet-stream"
 }
}

即使该文件具有扩展名(例如,包含文本“ Hello,world!”的hello.txt文件),并且该请求中没有任何地方提及“ application / octet-stream”,也会出现此错误。

罗宾·霍迪

Google Drive API似乎对格式化请求正文非常挑剔,这种formatMultiPartBody方法最终对我有用:

private formatMultipartBody(file: File, fileName: string, base64Data: string): string {
    const delimiter = `--${this.BOUNDARY}`;
    const closeDelimiter = `--${this.BOUNDARY}--`;
    const metadata = {
      name: fileName, mimeType: file.type || 'application/octet-stream'
    };
    const body = `
    \n${delimiter}\
    \nContent-Type: application/json; charset=UTF-8\
    \n\n${JSON.stringify(metadata)}\
    \n${delimiter}\
    \nContent-Type: ${file.type || 'application/octet-stream'}\
    \nContent-Transfer-Encoding: base64\      
    \n\n${base64Data}\
    \n${closeDelimiter}`;
    return body;
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Angular Gapi将简单文本上传到Google云端硬盘

将文件上传到Google云端硬盘?

使用php curl将文件上传到Google云端硬盘

使用Dropzone将文件上传到Google云端硬盘

使用意图将文件上传到Google云端硬盘

在后台将文件上传到Google云端硬盘

将文件从网络上传到Google云端硬盘

将文件从Blobstore上传到Google云端硬盘

使用http上传到Google云端硬盘文件夹

使用Windows服务自动将文件上传到Google云端硬盘文件流

Python:如何使用folderId将文件上传到Google云端硬盘中的特定文件夹

使用PyDrive将图片上传到Google云端硬盘

使用Curl将文件上传到Google云端硬盘会显示401

使用Android将文本文件上传到Google云端硬盘

使用cURL将文件上传到Google云端硬盘-access_token过期问题

使用javascript(无html表单)以编程方式将文件上传到Google云端硬盘

如何使用Apps脚本将云端硬盘中的现有文件上传到云端硬盘

Google云端硬盘API将文件上传到Java团队硬盘

如何使用REST API将新修订版本上传到Google云端硬盘中的特定文件?

无法将文件上传到Google云端硬盘中的文件夹

无法将文件上传到Google云端硬盘上的特定文件夹

将文件上传到Google云端硬盘中的特定文件夹

将文件上传到Google云端硬盘后,如何处理该事件(调用脚本)?

将内存中的文件下载并上传到Google云端硬盘

通过Javascript API将多个文件上传到Google云端硬盘的最佳策略

可靠地将大文件上传到Google云端硬盘

通过HTTP请求(C)将文件上传到Google云端硬盘

C:通过HTTP请求将文件上传到Google云端硬盘的错误408响应

如何将持续更新的文件夹上传到Google云端硬盘?