Получение файла из Amazon S3 в клиентское веб-приложение — должно ли это происходить через веб-API?

Я создаю веб-API ASP .Net Core 2.1. Внешний интерфейс (написанный на Angular) будет использовать этот API, который используется для ряда вещей, одна из которых — сохранение и извлечение файлов (изображений, документов PDF и Word и т. д.).

Мы храним все эти файлы на Amazon S3. Я смотрел обучающее видео (https://www.youtube.com/watch?v=eRUjPrMMhCc), где парень показывает, как создать корзину, а также загрузить и скачать файл из Amazon S3 с помощью веб-API ASP .Net Core 2.0, что мне показалось фантастическим, поскольку это именно то, что мне было нужно.

Но потом я понял, что, хотя функциональность загрузки может быть полезной, загрузка может и не быть. Причина в том, что если пользователь запрашивает файл (хранящийся на Amazon S3) через клиентское веб-приложение, и этот запрос поступает в API (как и было моим первоначальным намерением), то API должен будет сначала загрузить этот файл из S3. (что может занять несколько секунд), а затем отправить его клиенту (еще несколько секунд). Таким образом, файл передается дважды и, следовательно, излишне замедляет процесс получения файла от S3 к клиенту.

Правильно ли мое мышление здесь? Было бы лучше, если бы клиент Angular получал файл напрямую из S3, а не через API? В плане скорости?


person Fabricio Rodriguez    schedule 06.08.2018    source источник


Ответы (1)


У Amazon SDK есть методы для обработки всех ваших сценариев. Принцип здесь заключается в том, чтобы получить подписанный URL-адрес от Amazon S3 с помощью SDK, а затем передать его на ваш внешний интерфейс.

  import * as AWS from "aws-sdk/global";

      AWS.config.update({
        region: env.bucketRegion,
    });

    let clientParams:any = {
        region: env.bucketRegion,
        apiVersion: '2006-03-01',
        params: {Bucket: env.rekognitionBucket}
    };
    if (environment.s3_endpoint) {
        clientParams.endpoint = env.s3_endpoint;
    }

    let s3 = new S3(clientParams);

   let url = s3.getSignedUrl('getObject', {
      Bucket: env.rekognitionBucket,
      Key: '1234.txt',
  });
person Abderrahim Soubai-Elidrisi    schedule 06.08.2018
comment
Хорошо, я не знал об этом. Спасибо, Абдеррайн! - person Fabricio Rodriguez; 07.08.2018