#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…