[英]How do I directly trigger a download window for a downloaded S3 file in .NET?
我对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
对象,该对象是从MemoryStream
创建的,而无需将其保存在本地的任何位置。
为此,您首先需要以MemoryStream
的形式获取 S3 对象。
将您的 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
。
确保还设置了文件名( File(...)
第三个参数,以便浏览器可以确定下载的文件类型:
public async Task<IActionResult> DownloadS3File() {
...
return File(memoryStream.ToArray(), "application/octet-stream", "filename.pdf");
}
这应该会触发从 Amazon S3 下载的对象的下载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.