c# - 如何在 .NET 中直接触发下载的 S3 文件的下载窗口?
问题描述
我对aws s3存储还不是很了解,但是我已经可以使用nuget awssdks进行列出/上传/下载对象的基本操作了。
但是,在下载对象时,我必须在我的 Web 服务器上创建一个文件,然后让我的用户可以使用该文件。
在我看来,我不知道如何直接下载到客户端。
这可能吗 ?如果是的话,有什么方法可以做到这一点?
如何简单地转换我当前的源代码以便在 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;
}
解决方案
您需要从处理程序操作中返回一个File
对象,该对象是从 a 创建的,MemoryStream
而无需将其保存在本地任何位置。
为此,您首先需要以MemoryStream
.
将您的 S3 对象的bucketName
&传递给,它返回类型为 的响应。key
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);
}
File
复制后,在您的控制器操作中返回转换为 a 。
确保还设置一个文件名(第三个参数,File(...)
以便浏览器可以确定下载的文件类型:
public async Task<IActionResult> DownloadS3File() {
...
return File(memoryStream.ToArray(), "application/octet-stream", "filename.pdf");
}
这应该会触发从 Amazon S3 下载的对象的下载。
推荐阅读
- azure-service-fabric - 如何从 IEnumerable 上传 IReliable 字典中的数据
- c# - 如何在asp.net mvc 5中使用linq从数据库中选择日期列并与当前日期进行比较以打印数据?
- git - 带有 GIT 提取的 SSIS - 无法膨胀包文件
- laravel - 如何使用 laravel 将数据存储在数据库中
- java - 线程等待多个线程
- javascript - Jest - 函数内的存根函数
- jwt - 如何为 Kin 市场 JWT 集成创建密钥
- python-2.7 - Jupyter Notebook 不支持 MARKDOWN 单元格中的笑脸
- php - 如何使用 bbcode 标签的值将 bbcode url 标签转换为 html 超链接?
- c# - 两个用户输入必须除以 5,这样程序才能完成