node.js - 通过驱动器 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.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'
使用 atfileMetadata
,图像文件也会被上传为image/png
. 但是例如,如果'mimeType':'application/pdf'
使用 atfileMetadata
,则图像文件上传为application/pdf
. 请注意这一点。所以我也建议修改为10100111001 的回答'mimeType':'image/png'
中提到的。 - 在“googleapis@43.0.0”,模式
resource: fileMetadata
和requestBody: fileMetadata
工作。
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
推荐阅读
- javascript - 如何修复在 Node.JS 和 Socket.io 中关闭的播放器定位
- sails.js - Sails.js 1.1.0 安全问题:将 lodash 升级到 4.17.13 或更高版本
- android - 为什么我的 Listview 没有在我的活动中显示任何内容?
- python - 有没有办法提高 PyPDF2.PdfFileReader 的文件读取速度。读取多个文件需要太多时间
- python - python中数字幂的浮点数
- ruby-on-rails - 无法加载命令 Puma: NameError: Wrong Constant Name 'Model-Names' Copy
- java - 在包含数据库数据的列表中使用线程
- r - 在R中循环多个变量
- postgresql - Postgres 11 插入冲突选择 *
- javascript - Puppeteer/JQuery:选择器在滚动脚本中不起作用