Строка Base64 img не отображается при загрузке через API-интерфейс диска - PullRequest
0 голосов
/ 05 октября 2019

Я загрузил строку img base64 в Google Drive через API в выражении узла. После загрузки 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 base 64:

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

Я удаляю данные: image / png; base64 перед загрузкой, как было предложено в других темах. ,Сбой с или без этого префикса.

Ответы [ 2 ]

0 голосов
/ 06 октября 2019
  • Вы хотите загрузить изображение на Google Диск с помощью googleapis с node.js.
  • Изображение img - это данные base64.
  • Вы уже смоглизагружать и скачивать файлы на Google Диск с помощью Drive API.

Если я правильно понял, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Точки изменения:

  • К сожалению, когда данные base64 загружаются с помощью googleapis, данные 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' используется в fileMetadata, файл изображениязагружено как image/png. Но, например, если 'mimeType':'application/pdf' используется при fileMetadata, файл изображения загружается как application/pdf. Пожалуйста, будьте осторожны с этим. Поэтому я также рекомендую изменить значение на 'mimeType':'image/png', как указано в ответе 10100111001 .
  • При "googleapis@43.0.0" оба шаблона resource: fileMetadata и requestBody: fileMetadata работают.

Ссылки:

Если я неправильно понял ваш вопрос и это не то направление, которое вам нужно, я приношу свои извинения.

0 голосов
/ 05 октября 2019

Вам нужно изменить mimeType на image/png.

Смотрите здесь Что такое Mime Types

Редактировать: Свойствоимя для fileMetadata называется requestBody вместо resource.

let res = await drive.files.create ({requestBody: fileMetadata, media: media, поля: 'id',});

https://github.com/googleapis/google-api-nodejs-client/blob/7e2b586e616e757b72f7a9b1adcd7d232c6b1bef/src/apis/drive/v3.ts#L3628

...