Миграция с aws-sdk-js v2 на v3. Ошибка Sharp: входной файл отсутствует
Работает с aws-sdk-js v2:
const Sharp = require('sharp');
const AWS = require('aws-sdk');
const S3 = new AWS.S3({ signatureVersion: 'v4' });
const originalPhoto = (await S3.getObject({ Bucket: "myBucket", Key: "myKey" }).promise()).Body;
const originalPhotoDimensions = await Sharp(originalPhoto).metadata();
Ошибка с aws-sdk-js v3: я так понимаю, потому что
originalPhoto
не является буфером.
const Sharp = require('sharp');
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const S3 = new S3Client({ region: "us-east-1" });
const originalPhoto = (await S3.send(new GetObjectCommand({ Bucket: "myBucket", Key: "myKey" }))).Body;
const originalPhotoDimensions = await Sharp(originalPhoto).metadata(); // <--- Error
Ошибка: входной файл отсутствует
ERROR Unhandled Promise Rejection
{"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"Error: Input file is missing",
Версия Sharp: 0.28.1
3 ответа
Для тех, кто ищет работающее решение, нужно вернуть буфер и передать его шарпу:
const Sharp = require('sharp');
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");
const s3Client = new S3Client({ region: "eu-west-1" });
async function getFileAsBuffer(fileKey) {
const params = {
Bucket: BUCKET,
Key: fileKey,
};
try {
// Create a helper function to convert a ReadableStream to a buffer.
const streamToBuffer = (stream) =>
new Promise((resolve, reject) => {
const chunks = [];
stream.on("data", (chunk) => chunks.push(chunk));
stream.on("error", reject);
stream.on("end", () => resolve(Buffer.concat(chunks)));
});
// Get the object from the Amazon S3 bucket. It is returned as a ReadableStream.
const data = await s3Client.send(new GetObjectCommand(params));
return await streamToBuffer(data.Body);
} catch (err) {
console.log("Error", err);
}
}
async function getImageMetaData() {
const fileBuffer = await getFileAsBuffer('fileKey');
const metadata = await Sharp(fileBuffer).metadata();
console.log("metadata:", metadata.format, metadata.height, metadata.width);
}
Решение, вдохновленное этой статьей: вывод буфера из aws-sdk v3 s3 GetObjectCommand
В первом блоке кода я вижу это
.promise()
. Этот вызов метода отсутствует во втором блоке кода. Сообщение об ошибке
Unhandled Promise Rejection
. Возможно, вы могли бы изменить 2-й блок, чтобы включить вызов этого метода так же, как он находится в первом блоке?