Загруженное изображение бессерверной платформы повреждено - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь написать службу загрузки файлов, используя бессерверную структуру, которая может принимать двоичный ввод и сохранять данные в S3.

Проблема в том, что файлы оказываются поврежденными в корзине S3. Текстовые файлы проходят, но мое тестовое изображение - нет.

Это мой код:

const serverless = require('serverless-http');
const express = require('express');
const crypto = require("crypto")
const AWS = require('aws-sdk');

const app = express();
const s3 = new AWS.S3();

app.use(function(req, res, next) {
    var chunks = [];

    req.on('data', function(chunk) { chunks.push(chunk); });
    req.on('end', function() {
        req.rawBody = Buffer.concat(chunks);
        next();
    });
});

app.put('/v1/upload', async (req, res, cb) => {
    let hash = crypto.createHash("sha256").update(req.rawBody).digest("hex");

    console.log(req.rawBody.length);
    ... s3 stuff here

Я вижу в консоли, что размер файла неверный; 2540872. Реальный размер - 1395559. Я использую curl для проверки загрузки

curl -v -X PUT -H "Content-Type: application/octet-stream" --data-binary @test/image.png http://localhost:3000/prod/v1/upload

1 Ответ

0 голосов
/ 07 мая 2020

Самый простой способ сделать это - полностью исключить функцию Lambda из l oop для управления процессом загрузки. S3 имеет функцию, которая позволяет вам создавать временный набор учетных данных, чтобы позволить пользователю загружать файл непосредственно в корзину S3. Это дает много преимуществ, самые большие из которых - снижение стоимости потоковой передачи двоичных данных Lambda и выставления счетов за 100 мс, а также гораздо более надежная загрузка только для поддержки размеров файлов и управления ошибками. Это означает, что вместо того, чтобы пользователь загружал форму через API-шлюз в Lambda, процесс из внешнего интерфейса выглядит намного больше:

  1. Сделать HTTP-запрос к конечной точке API-шлюза, который запускает Lambda функция. Затем функция Lambda использует AWS SDK для создания предварительно подписанного URL-адреса и политики с действующими разрешениями (https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#createPresignedPost -property ). Эти данные затем возвращаются клиенту внешнего интерфейса
  2. Внешний интерфейс создает форму, соответствующую требованиям этого предварительно подписанного URL, вместе с сущностью загрузки файла. Затем двоичный файл будет напрямую загружен в корзину S3.
  3. На этом этапе интерфейс может вызвать другую лямбда-функцию (через API-шлюз), если необходимо, чтобы начать обработку нового изображения и связать его с user или что-то еще, что должно произойти в этот момент. Вы даже можете асинхронно обрабатывать изображение, напрямую прикрепив событие S3 put к лямбда-функции (https://www.serverless.com/framework/docs/providers/aws/events/s3/#s3)

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...