C# MVC 从 S3 异步下载大文件

2023-12-29

我必须从 aws S3 async 下载文件。我有一个锚标记,单击它时,将在控制器中点击一个方法以供下载。该文件应该在浏览器底部开始下载,就像其他文件下载一样。

In View

<a href="/controller/action?parameter">Click here</a>

在控制器中

public void action()
{
     try
     {
           AmazonS3Client client = new AmazonS3Client(accessKeyID, secretAccessKey);
           GetObjectRequest req = new GetObjectRequest();
           req.Key = originalName;
           req.BucketName = ConfigurationManager.AppSettings["bucketName"].ToString() + DownloadPath;
           FileInfo fi = new FileInfo(originalName);
           string ext = fi.Extension.ToLower();
           string mimeType = ReturnmimeType(ext);
           var res = client.GetObject(req);
           Stream responseStream = res.ResponseStream;
           Stream response = responseStream;
           return File(response, mimeType, downLoadName);
     }
     catch (Exception)
     {
           failure = "File download failed. Please try after some time.";   
     }              
}

上述函数使浏览器加载直到文件完全下载。然后只有文件在底部可见。我看不到 mb 是如何下载的。
提前致谢。


您必须发送ContentLength向客户端显示进度。浏览器没有关于它将接收多少数据的信息。

如果你看一下来源FileStreamResult类,被使用File方法,它不会通知客户端有关“Content-Length”的信息。https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/FileStreamResult.cs https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/FileStreamResult.cs

替换这个,

return File(response, mimeType, downLoadName);

with

return new FileStreamResultEx(response, res.ContentLength, mimeType, downloadName);


public class FileStreamResultEx : ActionResult{

     public FileStreamResultEx(
        Stream stream, 
        long contentLength,         
        string mimeType,
        string fileName){
        this.stream = stream;
        this.mimeType = mimeType;
        this.fileName = fileName;
        this.contentLength = contentLength;
     }


     public override void ExecuteResult(
         ControllerContext context)
     {
         var response = context.HttpContext.Response; 
         response.BufferOutput = false;
         response.Headers.Add("Content-Type", mimeType);
         response.Headers.Add("Content-Length", contentLength.ToString());
         response.Headers.Add("Content-Disposition","attachment; filename=" + fileName);

         using(stream) { 
             stream.CopyTo(response.OutputStream);
         }
     }

}

选择

一般来说,从服务器下载和传送 S3 文件是一种不好的做法。您将向您的托管帐户收取两倍的带宽费用。相反,您可以使用签名 URL 来传递非公共 S3 对象,其生存时间只有几秒钟。你可以简单地使用预签名 URL

 public ActionResult Action(){
     try{
         using(AmazonS3Client client = 
              new AmazonS3Client(accessKeyID, secretAccessKey)){
            var bucketName = 
                 ConfigurationManager.AppSettings["bucketName"]
                .ToString() + DownloadPath;
            GetPreSignedUrlRequest request1 = 
               new GetPreSignedUrlRequest(){
                  BucketName = bucketName,
                  Key = originalName,
                  Expires = DateTime.Now.AddMinutes(5)
               };

            string url = client.GetPreSignedURL(request1);
            return Redirect(url);
         }
     }
     catch (Exception)
     {
         failure = "File download failed. Please try after some time.";   
     }              
 }

只要对象没有公共读取策略,未经签名的用户就无法访问对象。

另外,您必须使用using around AmazonS3Client为了快速处理网络资源,或者只使用一个静态实例AmazonS3Client这将减少不必要的分配和取消分配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# MVC 从 S3 异步下载大文件 的相关文章

  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 使用 boto3 从 s3 下载时使用 filename 作为文件名

    我正在使用 boto3 上传文件 如下所示 client boto3 client s3 aws access key id id aws secret access key key client upload file tmp test
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • S3 对象级别事件未触发

    我在 aws eventsbridge 中使用事件模式创建了一个事件规则 source aws s3 目标是 CloudWatch 日志组 现在 当我在存储桶级别更改某些内容时 例如存储桶权限 然后我看到云监视中捕获的事件 但是当我在 s3
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 将自定义 ValueProviderFactories 添加到 ASP.NET MVC3?

    我试图尝试将 Protobuf ValueProviderFactory 添加到 MVC3 以便我可以选择 MIME 类型并将原始数据反序列化为操作参数的对象 我还可以使用它来更改默认的 Json 序列化器 看着JsonValueProvi

随机推荐

  • 如何为每个箱线图设置不同的颜色

    我正在尝试在 VSCode 中制作 Seaborn 箱线图 我的代码基于这里的示例 here https github com bvalgard Boxplots blob master Boxplots ipynb 我专门制作了类似倒数第
  • Tkinter 帮助查看器

    我有一个简单的 Python Tkinter 应用程序 我想向其中添加帮助文档 将帮助查看器集成到应用程序的最简单方法是什么 最好是跨平台的 尽管我主要使用 Windows 我可以想象用纯 HTML 编写帮助 或者只是启动外部网络浏览器 使
  • 密码保护 Android 应用程序的启动

    我正在寻找一种在启动时用密码保护我的 Android 应用程序的方法 即当启动 恢复属于我的 apk 包的活动时 将显示密码对话框 我已经尝试了一些方法 扩展应用类 http developer android com reference
  • 在Excel中,使用VBA,如何获取“路径+文件名+扩展名”并更改扩展名?

    有一个动态生成 Excel 文件和 csv 的程序 excel 文件具有 加载时 加载 csv 数据的 VBA 代码 我想通过让 csv 文件具有相同的文件名但扩展名不同来动态调用该 csv 因此 根据我的理解 如果 xls 文件在这里 C
  • MS Access 直通查询到 SQL Server 需要什么字符清理

    我正在尝试将 MS Access 与 SQL Server 连接 并且我想确保我不会受到 SQL 注入攻击 我看到过使用 ADO 创建查询的参数化版本的建议 但我想了解如何通过 DAO 传递来清理我的输入 目前我正在转义单引号和反斜杠 VB
  • 在 Github 上分叉 Pull 请求

    有效分叉 Pull 请求的正确工作流程是什么 为了解释用例 我找到了一个存储库 其中包含一个添加了我需要的功能的拉取请求 不幸的是 拉取请求作者已经擅离职守 并且存储库所有者在编写测试之前不会接受拉取请求 我想 分叉 拉取请求并编写测试 以
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • Windows 上具有大型数组的 Python 多处理

    我使用python的多处理模块在linux平台上编写了一个脚本 当我尝试在 Windows 上运行该程序时 它不能直接工作 我发现这与 Windows 上如何生成子进程有关 所使用的物品是否可以腌制似乎至关重要 我的主要问题是 我正在使用大
  • 通过 CLI 的 AWS DynamoDB put-item 类型无效(unicode v. dict)

    我想通过命令行向我的 DynamoDB 表添加一个项目 但遇到了类型错误 我尝试添加的数据非常简单 id 1 我运行的命令同样简单 aws dynamodb put item table name my table item id 1 我收
  • required_if Laravel 5 验证

    我有用户可以填写的表格来出售他们的房屋 对于其中一项输入 用户必须选择 出售 或 出租 如果是出售 则会出现两个价格输入字段 如果是出租 则会出现基于 jQuery 的其他价格输入字段 我的问题是我希望价格字段是必需的 但是例如 如果我选择
  • 通过 SOS 调查 CLR

    目前 我正在深入研究 CLR 并尝试找到托管对象的适当大小 我有两种简单的类型 XClass class XClass public XStruct StructField new XStruct public int IntField p
  • 为什么在 javascript 中列出类的实际构造函数很重要

    我正在阅读 javascript 花园http bonsaiden github com JavaScript Garden http bonsaiden github com JavaScript Garden 关于 javascript
  • 为什么我的 OBJ 解析器渲染网格是这样的?

    我自己决定将 OBJ 解析器 导入器支持添加到我一直在开发的 3D 渲染引擎中 我已遵循规范在这里找到 http www martinreddy net gfx 3d OBJ spec几乎 到了发球台 除了当前限制对组 面 顶点 法线和纹理
  • IllegalStateException:PWC3990:已为此响应调用 getWriter()

    java lang IllegalStateException PWC3990 getWriter has already been called for this response 如何解决这个错误 我运行一个简单的 servlet 代码
  • 如何使用 FirefoxProfile 或 FirefoxOptions 通过 Selenium 设置 Firefox 浏览器的窗口位置

    我需要通过创建驱动程序来更改 Firefox 窗口的位置 driver webdriver Firefox 我知道创建驱动程序后可以更改窗口位置 driver set window position 我不知道如何使用 Firefox 配置文
  • 如何读取.net中的SQL Server架构信息?

    我如何在 C 中知道数据库中的表列表 每个表具有完整规范的列列表 例如第一列是 Id 其数据类型为 int 50 等 Use the 获取模式 http msdn microsoft com en us library ms136366 a
  • 全新安装后 EKEventStore.calendars 始终为空

    我的 iOS 应用程序有一个奇怪的问题 在全新安装后 如果我尝试添加日历事件 在接受本机日历权限提示后 我的 eventStore 单例永远不会显示任何可用的日历 并且defaultCalendarForNewEvents总是nil 我尝试
  • jquery中如何将密码转换成md5? [复制]

    这个问题在这里已经有答案了 实际上我正在创建更改密码页面 这是我检查旧密码是否与现有密码匹配的功能 该密码存储在数据库中的 MD5 中 因此我想首先将该密码转换为 MD5 然后我可以检查该密码 这是代码 function fnIsValid
  • iOS“当前图形上下文”-那是什么

    当我绘制线条和形状等时 我会在 iOS 中获得 当前图形上下文 到底什么是 当前图形上下文 我正在寻找 30 000 英尺的描述 现在我只是复制并粘贴 UI 代码 不太确定它在做什么 图形上下文是存储有关绘图状态的信息的地方 这包括填充颜色
  • C# MVC 从 S3 异步下载大文件

    我必须从 aws S3 async 下载文件 我有一个锚标记 单击它时 将在控制器中点击一个方法以供下载 该文件应该在浏览器底部开始下载 就像其他文件下载一样 In View a href controller action paramet