【问题标题】:How do I directly trigger a download window for a downloaded S3 file in .NET?如何在 .NET 中直接触发下载的 S3 文件的下载窗口?
【发布时间】:2021-11-28 15:50:48
【问题描述】:

我对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;
    }

【问题讨论】:

  • 到目前为止你尝试过什么?我看不到任何 S3 代码?
  • 您是在问如何读取文件然后在浏览器中下载文件?
  • @ErmiyaEskandary code public bool FileDownS3(string pLocalPath, string pFileNameS3) { IAmazonS3 lClient_Aws = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); TransferUtility lUtility = new TransferUtility(lClient_Aws);字符串文件名 = pLocalPath + pFileNameS3; FileStream fs = File.Create(filename); fs.Close(); lUtility.Download(filename, gBucketName, pFileNameS3);返回真; }code
  • @FabioAlvesFrancelino 请将代码添加到问题中,谢谢 :)
  • @smac2020 是的,如何将文件直接下载到客户端,而无需在我的网络服务器中创建文件。

标签: c# asp.net .net amazon-web-services amazon-s3


【解决方案1】:

您需要从您的处理程序操作中返回一个 File 对象,该对象是从 MemoryStream 创建的,而不会将其保存在本地的任何位置。

为此,您首先需要以MemoryStream 的形式获取 S3 对象。

将 S3 对象的 bucketNamekey 传递给 AmazonS3Client.GetObjectAsync(...),这将返回 GetObjectResponse 类型的响应。

GetObjectResponse 有一个名为ResponseStream 的属性。

这是一个继承自 Amazon.S3.Model.StreamResponsestream 对象。

然后您可以将其复制到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 下载的对象的下载。

【讨论】:

  • 太好了,我会执行你的建议并返回告诉你它是否有效
  • 找不到 AmazonS3Client.GetObjectAsync,我完全理解如何将文件存储在内存中的对象中,然后在下载时触发​​它,但我仍然对如何使用 S3 类感到困惑因为找不到你推荐的功能,我会继续搜索。
  • 在这个解决方案中,我还关心并发会话和服务器内存管理,有多少同时用户能够下载直到内存已满,我的 webapp 的限制是最大文件大小为 100MB可以尽量减少这个问题,但我有这个担心
  • 那是在实际客户端上,它不是静态方法 - 对你来说是lClient_Aws.Get…
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2019-01-20
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多