如何将图像从 NodeJS API 上传到谷歌驱动器 [英] How to upload images to google drive from NodeJS API

查看:16
本文介绍了如何将图像从 NodeJS API 上传到谷歌驱动器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经编写了 API 并且必须上传到 Heroku 服务器.当我在更改后在 Heroku 中推送数据时,所有图像都消失了.我不知道为什么他们没有显示.我发现了一些其他选项,例如直接在 Google Drive 中上传图片,并且我已经阅读了相关文档.我找不到任何与此相关的资源.

I have written API and got to upload in Heroku server. When I push the data in the Heroku after changes then all the images are gone. I don't know why they were not shown. I found some other option like images upload in Google Drive directly and I have gone through relevant documentations. I couldn't find any resources related to this.

谁能帮我提供将文件上传到 Google 云端硬盘的参考或建议?

Can anyone help me out with references or suggestions to upload files to Google Drive?

推荐答案

@KarlR 的回答很有帮助,但代码有其自身的缺陷.(范围不支持文件上传).让我逐步解释这一点,以便您可以轻松地将文件上传到 Google 云端硬盘.

@KarlR's answer is helpful, but the code has it's own faults. (The scope does not support for file uploads). Let me explain this step by step so that you can easily upload a file to Google Drive.

第 1 步:转到 Google Drive API V3 NodeJS 快速入门

Step 1: Go to Google Drive API V3 NodeJS quickstart

按照初始步骤操作,看看它是否有效.然后继续下一步.

Follow the initial steps and see whether it works. Then proceed to the next step.

第 2 步:使用名为 uploadFile 的函数并更改范围以适合上传.下面给出了代码段.

Step 2: Have a function named uploadFile and change the scope to suit the uploads. The code segment is given below.

在下面的例子中,文件是从 files/photo.jpg 中提取的,并重命名为 photo.jpg 并上传到 root> Google 云端硬盘的文件夹.

In the below example, the file is fetched from files/photo.jpg and is renamed as photo.jpg and uploaded to the root folder of Google Drive.

const fs = require('fs');
const readline = require('readline');
const { google } = require('googleapis');

// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/drive.file'];
const TOKEN_PATH = 'token.json';

/**
 * Create an OAuth2 client with the given credentials, and then execute the given callback function.
 */
function authorize(credentials, callback) {
  const {client_secret, client_id, redirect_uris} = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
      client_id, client_secret, redirect_uris[0]);

  // Check if we have previously stored a token.
  fs.readFile(TOKEN_PATH, (err, token) => {
    if (err) return getAccessToken(oAuth2Client, callback);
    oAuth2Client.setCredentials(JSON.parse(token));
    callback(oAuth2Client);
  });
}

/**
 * Get and store new token after prompting for user authorization, and then
 * execute the given callback with the authorized OAuth2 client.
 * @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for.
 * @param {getEventsCallback} callback The callback for the authorized client.
 */
function getAccessToken(oAuth2Client, callback) {
    const authUrl = oAuth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: SCOPES,
    });
    console.log('Authorize this app by visiting this url:', authUrl);
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
    });
    rl.question('Enter the code from that page here: ', (code) => {
        rl.close();
        oAuth2Client.getToken(code, (err, token) => {
            if (err) return console.error('Error retrieving access token', err);
            oAuth2Client.setCredentials(token);
            // Store the token to disk for later program executions
            fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
                if (err) return console.error(err);
                console.log('Token stored to', TOKEN_PATH);
            });
            callback(oAuth2Client);
        });
    });
}
/**
* Describe with given media and metaData and upload it using google.drive.create method()
*/ 
function uploadFile(auth) {
  const drive = google.drive({version: 'v3', auth});
  const fileMetadata = {
    'name': 'photo.jpg'
  };
  const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg')
  };
  drive.files.create({
    resource: fileMetadata,
    media: media,
    fields: 'id'
  }, (err, file) => {
    if (err) {
      // Handle error
      console.error(err);
    } else {
      console.log('File Id: ', file.id);
    }
  });
}

fs.readFile('credentials.json', (err, content) => {
  if (err) return console.log('Error loading client secret file:', err);
  // Authorize a client with credentials, then call the Google Drive API.
  authorize(JSON.parse(content), uploadFile);
});

第 3 步:更改正在上传的文件的名称

uploadFile 函数中,更改 name 属性.

In the uploadFile funciton, change the name property.

const fileMetadata = {
        'name': 'any_name_you_like'
};

第 4 步:上传不同类型的文件

您只需更改uploadFile 函数中的以下代码段.请参阅最常用的 MIME 类型,了解您的首选文件扩展名.

You only have to change the following code segment in the uploadFile function. See mostly used mime types for your preferred file extension.

const media = {
     mimeType: 'any_mime_type',
     body: fs.createReadStream('files/photo.jpg')
};

第 5 步:将文件上传到 Google Drive 上的特定文件夹

打开浏览器并登录您的 Google 云端硬盘.转到特定文件夹并查看浏览器 URL.它将如下所示.

Open the browser and log in to your Google Drive. Go to the specific folder and look at the browser URL. It will look like the following.

https://drive.google.com/drive/u/0/folders/1xxxXj_sdsdsdsd0Rw6qDf0jLukG6eEUl

1xxxXj_sdsdsdsd0Rw6qDf0jLukG6eEUl 是文件夹 ID(父 ID).更改 uploadFile 函数中的以下代码段.

1xxxXj_sdsdsdsd0Rw6qDf0jLukG6eEUl is the folder ID (parentID). Change the following code segment in the uploadFile function.

const fileMetadata = {
        'name': 'any_file_name',
        parents: ['1xxxXj_sdsdsdsd0Rw6qDf0jLukG6eEUl']
};

希望这足以满足您的要求.

Hope this is comprehensive enough for your requirements.

这篇关于如何将图像从 NodeJS API 上传到谷歌驱动器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆