如何在谷歌驱动器上上传文本文件?

Posted

技术标签:

【中文标题】如何在谷歌驱动器上上传文本文件?【英文标题】:How to upload text file on Google drive? 【发布时间】:2021-10-22 10:59:33 【问题描述】:

如何使用 CloudFunctions 在 Google 驱动器上上传文本文件?

文件已在本地文件夹中创建,但不知道如何在元数据正文中传递它。

我遵循以下方法:

第 1 步:写入文件

// Write file
fs.writeFileSync("sample.txt", "Hello content!");

第 2 步:准备元数据


    const metadata = 
      name: "sample.txt",
      parents: [parentFolder],
      mimeType: "text/plain",
      uploadType: "media",
    ;

第 3 步:调用 Google Drive API 上传文件

    axios(
      method: "POST",
      url: "https://www.googleapis.com/drive/v3/files?supportsAllDrives=true",
      headers: 
        Authorization: `Bearer $token`,
        Accept: "application/json",
        "Content-Type": "application/json",
      ,
      data: metadata,
    )
      .then((res) => 
        response.status(200).send(res.data);
      )
      .catch((err) => 
        response.status(500).send(err.message);
      );

所以整个函数代码是:

exports.onCreateFile = functions.https.onRequest((request, response) => 
  // <-- Some validation -->
    const parentFolder = request.query.parentFolder;
    if (!parentFolder) 
      response.status(400).send("Parent folder not found");
      return;
    

    // Write file
    fs.writeFileSync("vault.txt", "Hello content!");

    const metadata = 
      name: "vault.txt",
      parents: [parentFolder],
      mimeType: "text/plain",
      uploadType: "media",
    ;

    axios(
      method: "POST",
      url: "https://www.googleapis.com/drive/v3/files?supportsAllDrives=true",
      headers: 
        Authorization: `Bearer $token`,
        Accept: "application/json",
        "Content-Type": "application/json",
      ,
      data: metadata,
    )
      .then((res) => 
        // console.log(res.data);
        response.status(200).send(res.data);
      )
      .catch((err) => 
        // console.log(err);
        response.status(500).send(err.message);
      );
);

基本上移动应用会通过传递accessToken和parentFolderId来调用CloudFunction,而cloudFunction会在一些业务逻辑之后上传文件。

【问题讨论】:

云函数在哪里? @MartinZeitler 我已经更新了描述。 【参考方案1】:

最后通过以下方法解决了:

fs.writeFileSync("/tmp/sample.txt", "Hello Temp content!");

    const metadata = 
      name: "sample.txt",
      mimeType: "text/plain",
      parents: [parentFolder],
    ;

    const formData = new FormData();
    formData.append("metadata", JSON.stringify(metadata), 
      contentType: "application/json",
    );
    formData.append("file", fs.createReadStream("/tmp/sample.txt"));

    axios(
      method: "POST",
      url: "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true",
      headers: 
        Authorization: `Bearer $token`,
        "Content-Type": `multipart/related; boundary=$formData.getBoundary()`,
      ,
      data: formData,
    )
      .then((res) => 
        response.status(200).send(res.data);
      )
      .catch((err) => 
        response.status(500).send(err);
      );

这个Link 帮助解决了这个问题。

代表提问者发帖

【讨论】:

【参考方案2】:

您不能将文件作为元数据传递。相反,您可以将其作为表单数据传递,如下所示:

    const metadata =  name: "sample.txt", mimeType: "text/plain", parents: ["root"] ;
    const fileContent = "Hello content!";
    const fileBlob = new Blob([fileContent], type: "text/plain");
    const form = new FormData();
    form.append("metadata", JSON.stringify(metadata),  type: "application/json" ));
    form.append("file", fileBlob);
    fetch("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true", 
      method: "POST",
      headers: new Headers( Authorization: `Bearer $token` ),
      body: form,
    );

【讨论】:

它返回 400,现在尝试分段上传,但没有运气。 const form = new FormData(); form.append("file", "Some dummy text"); axios( method: "POST", url: "https://www.googleapis.com/drive/v3/files?uploadType=multipart&amp;supportsAllDrives=true", headers: Authorization: Bearer $token, Accept: "application/json", "Content-Type": multipart/form-data;边界=$form.getBoundary() , , data: form, ) .then((res) =&gt; response.status(200).send(res.data); ) 您没有将元数据附加到表单。尽量靠近我发布的示例代码。因为代码有效。 它正在工作,但在我的情况下有两个问题,也许您可​​以提供帮助:1:Node 中没有 Blob,我正在使用 fs.writeFileSync("/tmp/vault.txt", "Hello Temp content!"); 编写文件。附加元数据抛出ReferenceError: Blob is not defined 2:上传的“无标题”文本文件有----------------------------866368930733703415619015 Content-Disposition: form-data; name="file"; filename="vault.txt" Content-Type: text/plain Hello Temp content! ----------------------------866368930733703415619015-- 我更新了我的答案。看看它是否工作。不幸的是我无法测试它。如果它不起作用,请告诉我。你也可以试试blob:***.com/a/58896208/7821823 谢谢。我很高兴它得到了解决,并且我已经通过更新更新了我的问题。 link 帮助解决了这个问题。标头应该是 Authorization: Bearer $token, "Content-Type": multipart/related;边界=$formData.getBoundary(),

以上是关于如何在谷歌驱动器上上传文本文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌驱动器上创建空文件夹?

iframe在谷歌浏览器中与在ie、火狐中显示不一致问题!

如何使用 colab 在谷歌驱动器上保存 np.array?

如何打开谷歌驱动器公共链接

如何在谷歌脚本中将文本作为日期插入单元格? (符合时区转换)

使用 chrome 时如何在谷歌地图上制作多行标签?