Как мне напрямую запустить окно загрузки для загруженного файла S3 в .NET?

#c# #asp.net #.net #amazon-web-services #amazon-s3

Вопрос:

Я все еще не очень хорошо разбираюсь в хранилище aws s3, но я уже могу выполнять основные операции по перечислению / загрузке / загрузке объектов с помощью nuget awssdks.

Однако при загрузке объекта я должен создать файл на своем веб-сервере, а затем сделать файл доступным для моего пользователя.

Мне кажется, что я не знаю, как выполнить прямую загрузку на клиент.

Возможно ли это ? Если да, то как это сделать?

Как просто преобразовать мой текущий исходный код для прямой загрузки в S3 ?

Большое вам спасибо за руководство.

 private void DOWFile(string pFileDir, string pFileName, string pDescription)
{
    //Armazena o path do arquivo
    string lFilePath = pFileDir   pFileName;
    //Verifica se o arquivo existe
    if (File.Exists(lFilePath))
    {
        //Limpa o objeto de resposta
        Response.Clear();
        //Limpa o nome do arquivo
        if (Request.UserAgent.Contains("Firefox")) pDescription = TFileInfo.CONVERTToFileName(pDescription);   
        //Adiciona o cabeçalho do donwload
        Response.AddHeader("Content-Disposition", "attachment; filename=""   HttpUtility.UrlPathEncode(pDescription)   """);
        //Seta o tipo do arquivo
        Response.ContentType = "application/octet-stream";
        //Passa a referência do arquivo
        Response.WriteFile(lFilePath);
        //Executa o download do arquivo
        Response.Flush();
        //Finaliza o processamento
        HttpContext.Current.Response.SuppressContent = true;
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
    else
    {
        //Mostra a mensagem de Erro
        SETErrorInfo(new TErrorInfo(-1, "DOWFile", TErrorInfo.ErrFileNotFound, "FileNotFound - "   lFilePath, false, true, false, true, false, TErrorInfo.TErrType.etLogic));
    }
}

public bool FileDownS3(string pLocalPath, string pFileNameS3)
    {
        IAmazonS3 lClient_Aws = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);
        TransferUtility lUtility = new TransferUtility(lClient_Aws);

        string filename = pLocalPath   pFileNameS3;
        FileStream fs = File.Create(filename);
        fs.Close();


        lUtility.Download(filename, gBucketName, pFileNameS3);

        return true;
    }
 

Комментарии:

1. Что вы пробовали до сих пор? Я не вижу никакого кода S3?

2. Вы спрашиваете, как прочитать файл, а затем загрузить его в свой браузер?

3. @ErmiyaEskandary code общедоступные файлы bool 3(строка pLocalPath, строка pFileNameS3) { IAmazonS3 lClient_Aws = новый АмазонС3Клиент(Amazon. Региональная точка. USEast1); переносимость lUtility = новая переносимость(lClient_Aws); строковое имя файла = pLocalPath pFileNameS3; Файловый поток fs = Файл. Создать(имя файла); fs.Закрыть(); lUtility. Загрузка(имя файла, gBucketName, pFileNameS3); возвращает значение true; } code

4. @FabioAlvesFrancelino Пожалуйста, добавьте код к вопросу, спасибо 🙂

5. @smac2020 Да, как загрузить файл непосредственно на клиент, не создавая файл на моем веб-сервере.

Ответ №1:

Вам нужно вернуть File объект из действия обработчика, созданного из a MemoryStream , не сохраняя его нигде локально.

Для этого вам сначала нужно получить объект S3 в виде a MemoryStream .

Передайте bucketName amp; key для вашего объекта S3 в AmazonS3Client.GetObjectAsync(...) , который возвращает ответ типа GetObjectResponse .

GetObjectResponse имеет свойство под названием ResponseStream .

Это потоковый объект, который наследуется от Amazon.S3.Model.StreamResponse .

Затем вы можете скопировать это в MemoryStream :

 GetObjectResponse response = await s3Client.GetObjectAsync(bucketName, keyName);
MemoryStream memoryStream = new MemoryStream();

using (Stream responseStream = response.ResponseStream)
    responseStream.CopyTo(memoryStream);
}
 

После копирования верните преобразованное в a File в действии контроллера.

Не забудьте также указать имя файла (третий параметр File(...) , чтобы браузер мог определить тип файла для загрузки:

 public async Task<IActionResult> DownloadS3File() {
    ...
    return File(memoryStream.ToArray(), "application/octet-stream", "filename.pdf");
}
 

Это должно инициировать загрузку объекта, загруженного с Amazon S3.

Комментарии:

1. Отлично, я выполню ваше предложение и вернусь, чтобы сообщить вам, сработало ли оно

2. Не могу найти AmazonS3Client. GetObjectAsync, я прекрасно понял, как сохранить файл в памяти в объекте, а затем запустить его при загрузке, но я все еще не понимаю, как использовать классы S3 в основном, потому что я не могу найти функцию, которую вы предложили, я продолжу поиск.

3. В этом решении меня также беспокоят параллельные сеансы и управление памятью сервера, сколько одновременных пользователей смогут загружать до тех пор, пока память не будет заполнена, ограничение моего веб-приложения-максимальный размер файла 100 МБ, который может свести к минимуму эту проблему, но у меня есть эта проблема

4. То есть на реальном клиенте это не статический метод — для вас это lClient_Aws.Get…