Загрузить изображение (файл PNG) из Google App Script в S3 Bucket - PullRequest
2 голосов
/ 29 апреля 2020

Попытка загрузить файл png с помощью S3-для-Google-Apps-Script в корзину S3:

// get the image blob
const imgBlob = UrlFetchApp.fetch('imageUrl').getBlob();
  
// init S3 instance
const s3 = S3.getInstance(awsAccessKeyId, awsSecretKey);

// upload the image to S3 bucket
s3.putObject(bucketName, 'test.png', imgBlob, { logRequests:true });

Файл загружается в S3, но не идеальным способом! Это выглядит так:

enter image description here

Если я скачаю изображение и открою, получу error:

"Это может быть поврежден или использовать формат файла, который Preview не распознает. "

Итак, как я могу загрузить файл png в amazon S3 корзину из google-apps-script?


Кстати, я могу правильно загрузить изображение, когда «base64» используется для s3.putObject():

const base64 = Utilities.base64Encode(imgBlob.getBytes());
s3.putObject(bucketName, 'test.png', base64, { logRequests:true });
// go to S3 and clicking on the link I can see the base64 string

Но это загрузка в виде строки, например, когда я go S3 и нажимаю test.png Я вижу, как: "iVBORw0KGgoAAAANSUhEUgAAAgAAAAI ... II=", но Я хочу увидеть фактическое изображение не строка!

1 Ответ

3 голосов
/ 29 апреля 2020

Я верю вашей ситуации и цели следующим образом.

  • В вашей ситуации данные base64 изображения могут быть загружены. Но загруженные данные - это не изображение. Это строковые данные.
  • В вашей цели вы хотите загрузить файл изображения общедоступного изображения, используя URL-адрес изображения.

Для этого, как насчет этого ответа?

Проблема и обходное решение:

Когда я увидел скрипт «S3-for-Google-Apps-Script», кажется, что URL-адрес нельзя напрямую использовать для s3.putObject(). И введенный BLOB-объект преобразуется в тип строки с помощью getDataAsString(). Я думаю, что это является причиной вашей проблемы.

В этом ответе я хотел бы предложить изменить библиотеку GAS "S3-for-Google-Apps-Script" для использования массива байтов для payload.

Использование:

Сначала скопируйте проект GAS S3-для-Google-Apps-Script и измените его следующим образом.

Модифицированный скрипт:

О S3.prototype.putObject в файле S3.gs, пожалуйста, измените его следующим образом.

От:
request.setContent(object.getDataAsString());
До:
request.setContent(object.getBytes());

И, о S3Request.prototype.setContent в файле S3Request.gs, пожалуйста, измените его следующим образом.

С:
if (typeof content != 'string') throw 'content must be passed as a string'
До:
// if (typeof content != 'string') throw 'content must be passed as a string'

И, о S3Request.prototype.getContentMd5_ в файле S3Request.gs, пожалуйста, измените следующим образом .

С:
return Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, this.content, Utilities.Charset.UTF_8));
Кому:
return Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, this.content));

Пример сценария:

И, для вышеуказанного измененного сценария, пожалуйста, проверьте следующий сценарий.

const imageUrl = "###";  // Please set the image URL.
const s3 = S3.getInstance(awsAccessKeyId, awsSecretKey);  // Please set them.

const imageBlob = UrlFetchApp.fetch(imageUrl).getBlob();
s3.putObject(bucketName, 'test.png', imageBlob, { logRequests:true });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...