首页 > 解决方案 > 通过驱动器 api 上传时 Base64 字符串 img 不可见

问题描述

我已通过 node express 中的 API 将 base64 img 字符串上传到 Google Drive。上传 img 后,在云端硬盘中无法查看。我不确定如何解决此格式问题。我知道我可以先在本地保存 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;

}

编辑:

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

基数为 64 的 img 字符串是

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhAAAADqCAYAAADzlnzfAAAAAXNSR0I...

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

标签: node.jsfile-uploadgoogle-drive-api

解决方案


  • 您想使用带有 node.js 的 googleapis 将图像上传到 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
}
至:
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
};

笔记:

  • 即使'mimeType':'image/jpeg'使用 at fileMetadata,图像文件也会被上传为image/png. 但是例如,如果'mimeType':'application/pdf'使用 at fileMetadata,则图像文件上传为application/pdf. 请注意这一点。所以我也建议修改为10100111001 的回答'mimeType':'image/png'中提到的。
  • 在“googleapis@43.0.0”,模式resource: fileMetadatarequestBody: fileMetadata工作。

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。


推荐阅读