【问题标题】:What's the correct way to make the uploaded image file accessible via URL - google drive api v3使上传的图像文件可以通过 URL 访问的正确方法是什么 - google drive api v3
【发布时间】:2020-11-12 18:48:51
【问题描述】:

我在 Google API 的开发者控制台上创建了一个项目并启用了 Google Drive API。

我还创建并下载了我在 Node.js 后端服务器上使用的服务帐户凭据 .json 文件,并且连接和上传谷歌驱动器上的图像文件。

npm i googleapis

const { google } = require('googleapis');
let privatekey = require("./privatekey.json");

// configure a JWT auth client
let jwtClient = new google.auth.JWT(
    privatekey.client_email,
    null,
    privatekey.private_key,
    ['https://www.googleapis.com/auth/drive']);
//authenticate request
jwtClient.authorize(function (err, tokens) {
    if (err) {
        console.log(err);
        return;
    } else {
        console.log("Successfully connected to gdrive!");
    }
});

//Google Drive API
let drive = google.drive('v3');
drive.files.list({
    auth: jwtClient,
    q: "name contains 'photo'"
}, function (err, response) {
    if (err) {
        console.log('The API returned an error: ' + err);
        return;
        }
        console.log(response.data);
    var files = response.data.files;
    if (files.length == 0) {
        console.log('No files found.');
    } else {
        console.log('Files from Google Drive:');
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            console.log('%s (%s)', file.name, file.id);
        }
    }
});

let fs = require('fs');
var fileMetadata = {
  name: 'photo.png',
};
var media = {
  mimeType: 'image/jpeg',
  body: fs.createReadStream('files/photo.png'),
};
drive.files.create(
  {
    auth: jwtClient,
    resource: fileMetadata,
    media: media,
    fields: 'id',
  },
  function (err, file) {
    if (err) {
      // Handle error
      console.error(err);
    } else {
      console.log('File Id: ', file.data.id);
    }
  },
);


当我上传文件时,我会在响应中获得唯一的文件 ID。

在 android 应用程序以及前端反应应用程序上,我想使用 URL 显示这个图像文件。


我尝试了https://drive.google.com/open?id=PASTE 您的 ID HERE 和 http://drive.google.com/uc?export=view&id=PASTE YOUR ID HERE,但它说您需要访问权限。

我在上传图片时也尝试了publishAuto:true,但没有成功。

让上传的图片文件可以通过 URL 访问的正确方法是什么?

【问题讨论】:

    标签: javascript node.js reactjs google-api google-drive-api


    【解决方案1】:

    我通过创建一个新文件夹并将该文件夹的权限设置为解决它

    type: anyone
    role:  reader
    

    然后将图像上传到此文件夹。 当我想显示上传的图片时,我可以使用以下 URL 显示:

    https://drive.google.com/thumbnail?id=YOUR IMAGE ID
    

    这是完整的代码。

    const { google } = require('googleapis');
    let privatekey = require("./privatekey.json");
    let drive = google.drive('v3');
    
    // configure a JWT auth client - login and get the token
    let jwtClient = new google.auth.JWT(
        privatekey.client_email,
        null,
        privatekey.private_key,
        ['https://www.googleapis.com/auth/drive']);
    //authenticate request
    jwtClient.authorize(function (err, tokens) {
        if (err) {
            console.log(err);
            return;
        } else {
            console.log("Successfully connected to gdrive!");
        }
    });
    

    仅运行此代码一次。

    //For creating google drive folder
    var fileMetadata = {
        'name': 'ProductIcons',
        'mimeType': 'application/vnd.google-apps.folder'
    };
    drive.files.create({
        auth: jwtClient,
        resource: fileMetadata,
        fields: 'id'
    }, function (err, file) {
        if (err) {
            // Handle error
            console.error(err);
        } else {
            console.log('Folder Id: ', file);
        }
    });
    
    //For changing folder permission
    var fileId = 'FOLDER ID HERE';
    var permission =
        {
            'type': 'anyone',
            'role': 'reader',
        }
    ;
    
    let drive = google.drive('v3');
    drive.permissions.create({
        auth: jwtClient,
            resource: permission,
            fileId: fileId,
            fields: 'id',
        }, function (err, res) {
            if (err) {
                // Handle error...
                console.error(err);
    
            } else {
                console.log('Permission ID: ', res)
    
            }
        });
    

    然后使用以下代码在该文件夹中上传任意数量的图像。

    //For uploading image to folder
    var folderId = 'FOLDER ID HERE';
    let fs = require('fs')
    var fileMetadata = {
        'name': 'photo.png',
        parents: [folderId]
    };
    var media = {
        mimeType: 'image/jpeg',
        body: fs.createReadStream('files/photo.png')
    };
    drive.files.create({
        auth: jwtClient,
        resource: fileMetadata,
        publishAuto:true,
        media: media,
        fields: 'id'
    }, function (err, file) {
        if (err) {
            // Handle error
            console.error(err);
        } else {
            console.log('File Id: ', file.data.id);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 2021-02-11
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      相关资源
      最近更新 更多