通过驱动器 api 上传时,Base64 字符串 img 不可见

Jon*_*vis 2 file-upload node.js google-drive-api

我已通过 Node Express 中的 API 将 Base64 img 字符串上传到 Google Drive。上传图片后,在云端硬盘中无法查看该图片。我不确定如何解决此格式问题。我知道我可以先在本地保存 img,然后上传保存的 img 文件,但我希望有一种更简单的方法。

我的代码:

 const uploadImg = async (folderId,img)=>{


 process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0


 const scopes = [
     'https://www.googleapis.com/auth/drive'
 ];
 const auth = new google.auth.JWT(
     demoApiCreds.client_email, null,
     demoApiCreds.private_key, scopes
 );

 const drive = google.drive({ version: 'v3', auth });

 const fileMetadata = {
     'name': 'Client_Design_ScreenShotTest',
     'mimeType':'image/jpeg',
     'parents':[folderId]
 };


const uploadImg = img.split(/,(.+)/)[1];

const media = {
     body: uploadImg
 }

 let res = await drive.files.create({
     resource: fileMetadata,
     media: media,
     fields: 'id',
 });
 console.log('the response is',res);
 console.log('the data is ',res.data);
 return res.data;

}
Run Code Online (Sandbox Code Playgroud)

编辑:

该文件以 jpg 形式存储在驱动器中,但 img 是空白的,单击该 img 后,谷歌驱动器抱怨无法读取该文件。下载后img还是空白。

以 64 为基数的 img 字符串是

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhAAAADqCAYAAADzlnzfAAAAAXNSR0I...
Run Code Online (Sandbox Code Playgroud)

按照其他线程中的建议,我在上传之前删除了 data:image/png;base64 。无论有或没有此前缀,它都会失败。

Tan*_*ike 5

  • 您想要使用 googleapis 和 node.js 将图像上传到 Google Drive。
  • 图像img是base64数据。
  • 您已经能够使用 Drive API 将文件上传和下载到 Google Drive。

如果我的理解是正确的,这个答案怎么样?请将此视为多个答案之一。

修改要点:

  • 不幸的是,当使用googleapis上传base64数据时,base64数据没有被解码并且数据作为文本数据上传。所以当你看到上传的文件时,你看不到它的图像。如果Content-Transfer-Encoding: base64可以添加到请求正文中的base64数据的标头中,则将base64数据转换并作为图像上传。但是当使用googleapis时,现阶段还无法实现。

为了将图像编码的base64数据作为图像上传到Google Drive,下面的修改如何?

修改后的脚本:

在本次修改中,将base64图像转换为流类型并上传。请按如下方式修改您的脚本。

从:
const uploadImg = img.split(/,(.+)/)[1];

const media = {
  body: uploadImg
}
Run Code Online (Sandbox Code Playgroud) 到:
const stream = require("stream"); // Added

const uploadImg = img.split(/,(.+)/)[1];
const buf = new Buffer.from(uploadImg, "base64"); // Added
const bs = new stream.PassThrough(); // Added
bs.end(buf); // Added

const media = {
  body: bs // Modified
};
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 即使'mimeType':'image/jpeg'使用 at fileMetadata,图像文件也会上传为image/png. 但例如,如果'mimeType':'application/pdf'使用 at fileMetadata,则图像文件将上传为application/pdf. 请小心这一点。所以我也建议修改为10100111001的答案'mimeType':'image/png'中提到的。
  • resource: fileMetadata在“googleapis@43.0.0”,和的模式都requestBody: fileMetadata有效。

参考:

如果我误解了你的问题并且这不是你想要的方向,我很抱歉。