【问题标题】:express-fileupload to Google Drive API快速文件上传到 Google Drive API
【发布时间】:2020-03-10 02:21:24
【问题描述】:

我可以成功地将我上传的图片保存在我的公共上传文件夹中并集成谷歌驱动器api,但它似乎正在上传一个空文件。

我应该从我的 req.files 数据中将什么放入 Google Drive API 的 body 参数

{name: 'country.jpg',data: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 00 48 00 00 ff ed 26 0c 50 68 6f 74 6f 73 68 6f 70 20 33 2e 30 00 38 42 49 4d 04 04 00 00 00 00 00 22 ... 246290 more bytes>,size: 246340,encoding: '7bit',tempFilePath: '',truncated: false,mimetype: 'image/jpeg',md5: '8890c8336c58d854d490b41fa6ec0ad4',mv: [Function: mv]}

这是我经过身份验证后的 Google Drive API 调用。

const drive = google.drive({ version: "v3", auth });
drive.files.create({
 media: {
            mimeType: "image/jpeg",
            body: // WHAT TO PUT HERE
        },
        resource: {
            name: "photo.jpg"
            // if you want to store the file in the root, remove this parents
            //parents: ['folder id in which he file needs to be stored.']
        },
        fields: "id"
    })
    .then(function(resp) {
        //console.log("RESPONSE");
        console.log(resp, "resp");
    })
    .catch(function(error) {
        console.log("ERROR");
        console.log(error);
    });

【问题讨论】:

    标签: node.js express google-api google-drive-api google-api-nodejs-client


    【解决方案1】:

    那是因为您只上传实际上传文件所需的文件元数据。

    var media = {
            mimeType: 'image/jpeg',
            //PATH OF THE FILE FROM YOUR COMPUTER
            body: fs.createReadStream('C:/Users/me/Downloads/photo.jpg')
    };
    

    【讨论】:

    • 我没有将图像文件保存在我的上传文件夹中。我希望它直接进入 Google Drive。我不能使用 fs.createReadStream(FILE_PATH)。我该怎么做那个身体://在这里放什么?
    • 从哪里直接去google drive呢?如果您没有要发送给 google 的文件流,则无法上传文件。获取文件的文件流并上传。您当然需要用户选择他们希望上传的文件,这将为您提供文件在他们机器上的位置。
    • 我只在 Express API 应用程序中收到带有文件内容的请求,我应该如何接收它以获得流?
    • 你可能不能。您的问题是“上传文件需要发送什么”答案是“您需要发送用户希望上传的文件的文件流”。如果此 Express API 未向您发送要上传的文件的文件流,则您无法上传。也许再问一个关于如何从 Express API 获取文件流的问题?
    【解决方案2】:

    就像@DalmTo 提到的那样,您需要以某种方式将数据发送到 Google Drive API。

    如果你在你的文件系统中发送一个文件,你可以使用她提供的代码:

    var media = {
      mimeType: 'image/jpeg',
      body: fs.createReadStream(FILEPATH)
    };
    

    但是,由于您不会在上传之前尝试将文件保存到文件系统,因此您必须适应您的情况。

    我假设这些文件通过表单上传到达您的应用程序,因为您使用的是 Express。如果您也可以使用multer,则可以将文件作为Buffer 获取

    然后你可以convert that Buffer to a Stream

    您处理此问题的代码如下所示:

    Copyvar Readable = require('stream').Readable; 
    
    function bufferToStream(buffer) { 
      var stream = new Readable();
      stream.push(buffer);
      stream.push(null);
    
      return stream;
    }
    
    app.post('/upload', upload.single('picture'), function (req, res, next) {
      // req.file is the `picture` file
      var media = {
        mimeType: 'image/jpeg',
        body: bufferToStream(req.file.buffer)
      };
    })
    

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多