【问题标题】:Send image to Google Drive API from NodeJS从 NodeJS 将图像发送到 Google Drive API
【发布时间】:2020-03-05 21:01:15
【问题描述】:

我设法使用此代码将文本文件上传到谷歌 API

google.drive({
  version: 'v3',
  auth
})
var media = {
  mimeType: 'text/plain',
  body: 'text'
}
drive.files.create({
  media: media,
  fields: 'id'
})

但是,如果我尝试按照文档中的建议上传图像,我会在驱动器上获得空文件。 尝试这样做(文件存在并拥有所有权限)

const drive = google.drive({
  version: 'v3',
  auth
})
var media = {
  mimeType: 'image/png',
  body: fs.createReadStream(path.resolve(__dirname, '../assets/logo.png'))
}
drive.files.create({
  media: media,
  fields: 'id'
})

当我在调试控制台中查看请求时,我发现没有请求正文。

请帮忙。

下面是正在上传的整个组件

<template>
  <div>
    <button class="btn btn-block btn-success mb-3" @click="connect">Syncronize</button>
    <h3 class="text-center">
      <template v-if="getToken">Sync success</template>
      <template v-else>Sync failed</template>
    </h3>
    <button @click="tryUpload">Test API</button>
  </div>
</template>

<script>
  import OAuth2 from '../classes/OAuth2'
  import { mapActions, mapGetters } from 'vuex'
  const {google} = require('googleapis')

  export default {
    computed: {
      ...mapGetters([
        'getToken'
      ])
    },
    methods: {
      ...mapActions([
        'saveToken'
      ]),
      connect () {
        (async () => {
          let token = await new OAuth2().getToken()
          this.saveToken(token)
        })()
      },
      tryUpload () {
        const auth = new google.auth.OAuth2(
          '....',
          '.....',
          'http://127.0.0.1:42813/callback'
        )
        auth.setCredentials(this.getToken)
        const drive = google.drive({
          version: 'v3',
          auth
        })
        let stream = fs.createReadStream(path.resolve(__dirname, '../assets/logo.png'))
        var media = {
          mimeType: 'image/png',
          body: stream
        }
        drive.files.create({
          media: media,
          fields: 'id'
        }, function (err, file) {
          if (err) {
            console.error(err)
          } else {
            console.log('File Id: ', file.id)
          }
        })
      }
    }
  }
</script>

【问题讨论】:

  • 我认为您问题中的以下脚本可以正确上传文件名为Untitled 的图像文件。那么你能告诉我们你上传的21 bytes文件的内容吗?还有,你能提供整个剧本吗?当然,请删除您的个人信息。
  • 21 字节是 payload "imgs/logo--assets.png" 的字符串。那是该文件的确切内容。整个脚本本身是安装在 electron.js 中并与 webpack 4 捆绑在一起的 Vue.js 应用程序。上传功能在“like”浏览器 chromium 中执行。并且还提供了这个组件
  • 感谢您的回复和补充信息。从您的脚本中,我认为上传图像文件的脚本有效。但在这种情况下,未设置文件元数据。例如,如何设置文件元数据?但我不确定这是否是您问题的直接解决方案。因此,如果这没有解决您的问题,我深表歉意。
  • 是的,我也已经尝试过使用元数据。设置元数据会更改 api 方法调用,但此调用也会发送错误数据。感谢您的努力
  • 感谢您的回复。很抱歉我的评论没有解决您的问题。作为测试运行,当Node.js在终端上只运行上传图片文件的脚本时,你会得到什么结果?如果文件可以正确上传,则可以认为问题的原因出现在除了上传文件的脚本之外的其他部分。这个怎么样?

标签: node.js google-drive-api


【解决方案1】:

尝试使用 require 导入文件

var media = {
  mimeType: 'image/png',
  body: require(path.resolve(__dirname, '../assets/logo.png'))
}

实际上,您正在上传流本身,而不是正在流式传输的文件。如果你想使用 fs,你应该尝试使用 stream.on('{event}' function () {}) 方法内部的回调来访问流。

【讨论】:

  • 感谢您的帮助。但没有运气。如果我确实需要,它会像这样prntscr.com/rcovol 开始发送它,但在 Google.drive 上它会创建 21 个字节的文件。
  • 我也尝试在 stream.on('load', () => {......}) 中设置所有内容,但没有任何改变
【解决方案2】:

当我使用箭头函数语法和 async/await 上传文件时,它对我有用(至少对我来说这样更舒服):

// Your tryUpload Function
const tryUpload = async () => {

    // ...Previous OAuth workflow

    // Build Drive service  
    const drive = google.drive({version: 'v3', auth});
    try {
        const data = await uploadFile(drive);
        console.log(data);
    } catch(err){
        console.log(`There was a problem in the promise ---> ${err}`);
    }
} 

const uploadFile = (drive) =>{
    // Set file metadata and data
    const fileMetadata = {'name': 'testupload.png'};
    const media = {
      mimeType: 'image/png',
      // If it's in the same dir, just pass 'testupload.png'
      body: fs.createReadStream('path/to/testupload.png') 
    };
    // Return the Promise result after completing its task
    return new Promise((resolve, reject) => {
      // Call Files: create endpoint
      return drive.files.create({
        resource: fileMetadata,
        media: media
      },(err, results) => err ? reject(err) : resolve(results))
    });
};

文档

作为帮助您的指南。我使用了这些文档:

Files: create.

Perform a simple upload.

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 2018-04-19
    • 2019-12-24
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多