繁体   English   中英

如何在 .NET 中直接触发下载的 S3 文件的下载窗口?

[英]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 对象的bucketNamekey传递给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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM