从 ASP.NET Core Web API 将多 GB 文件流式传输到 AWS S3

2024-03-09

我希望通过 ASP.NET Core Web API 在 AWS S3 存储桶中创建一个大型(多 GB)文件。该文件足够大,我不想加载Stream在将其上传到 AWS S3 之前先将其存储到内存中。

Using PutObjectAsync()我被迫预先填充Stream在将其传递给 AWS SDK 之前,如下所示:

var putObjectRequest = new PutObjectRequest
{
    BucketName = "my-s3-bucket",
    Key = "my-file-name.txt",
    InputStream = stream
};
var putObjectResponse = await amazonS3Client.PutObjectAsync(putObjectRequest);

我的理想模式是 AWS SDK 返回一个StreamWriter(某种意义上)我可以Write()多次然后Finalise()当我完成时。

关于我的挑战的两个问题:

  • 我是否对必须预先填充有误解Stream在致电之前PutObjectAsync()?
  • 我应该如何上传大(多 GB)文件?

对于这样的情况AWS docs http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html提供两个选项:

  • 使用 AWS .NET 开发工具包进行分段上传(高级 API) http://docs.aws.amazon.com/AmazonS3/latest/dev/usingHLmpuDotNet.html
  • 使用 AWS .NET 开发工具包进行分段上传(低级 API) http://docs.aws.amazon.com/AmazonS3/latest/dev/usingLLmpuDotNet.html

高级 API 只是建议您创建一个TransferUtilityUploadRequest http://docs.aws.amazon.com/AmazonS3/latest/dev/HLuploadFileDotNet.html with a PartSize指定,这样类本身就可以上传文件,而不需要自己维护上传。在这种情况下,您可以通过订阅来获取分段上传的进度StreamTransferProgress http://docs.aws.amazon.com/AmazonS3/latest/dev/LLTrackProgressMPUNet.html事件。您可以上传文件、流或目录。

低级API http://docs.aws.amazon.com/AmazonS3/latest/dev/LLuploadFileDotNet.html显然,更复杂,但更灵活 - 您可以启动上传,然后循环上传文件的下一部分。文档中的示例代码:

var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);

// List to store upload part responses.
var uploadResponses = new List<UploadPartResponse>();

// 1. Initialize.
var initiateRequest = new InitiateMultipartUploadRequest
    {
        BucketName = existingBucketName,
        Key = keyName
    };

var initResponse = s3Client.InitiateMultipartUpload(initRequest);

// 2. Upload Parts.
var contentLength = new FileInfo(filePath).Length;
var partSize = 5242880; // 5 MB

try
{
    long filePosition = 0;
    for (var i = 1; filePosition < contentLength; ++i)
    {
        // Create request to upload a part.
        var uploadRequest = new UploadPartRequest
            {
                BucketName = existingBucketName,
                Key = keyName,
                UploadId = initResponse.UploadId,
                PartNumber = i,
                PartSize = partSize,
                FilePosition = filePosition,
                FilePath = filePath
            };

       // Upload part and add response to our list.
       uploadResponses.Add(s3Client.UploadPart(uploadRequest));

       filePosition += partSize;
   }

   // Step 3: complete.
   var completeRequest = new CompleteMultipartUploadRequest
       {
           BucketName = existingBucketName,
           Key = keyName,
           UploadId = initResponse.UploadId,
        };

   // add ETags for uploaded files
   completeRequest.AddPartETags(uploadResponses);

   var completeUploadResponse = s3Client.CompleteMultipartUpload(completeRequest);     
}
catch (Exception exception)
{
    Console.WriteLine("Exception occurred: {0}", exception.ToString());
    var abortMPURequest = new AbortMultipartUploadRequest
        {
            BucketName = existingBucketName,
            Key = keyName,
            UploadId = initResponse.UploadId
        };
    s3Client.AbortMultipartUpload(abortMPURequest);
}

异步版本UploadPart http://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/MS3S3UploadPartAsyncUploadPartRequestCancellationToken.html也可用,因此如果您需要完全控制上传,则应该调查该路径。

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

从 ASP.NET Core Web API 将多 GB 文件流式传输到 AWS S3 的相关文章

  • ASP.NET MVC4 教程/脚手架 - 验证和显示使用几种不同的区域设置

    我正在使用 VS 2012 RC 并尝试从此处遵循 MVC4 教程 http www asp net mvc tutorials mvc 4 getting started with aspnet mvc4 accessing your m
  • Microsoft Access 数据库引擎找不到对象“Sheet1$”

    我正在将保存在服务器文件夹中的模板 Excel 文件复制到具有不同名称的同一文件夹中 插入值 我可以复制文件 但是当我尝试插入值时 它显示工作表 找不到 我给出了正确的工作表名称 在名为sheet1的电子表格中只添加了一张工作表 仍然显示错
  • 以非 root 用户身份使用 AWS CodeBuild

    有没有办法掉root用户开启AWS 代码构建 我们正在构建一个 Yocto 项目 如果我们是 root Bitbake 健全性检查 该项目将在 CodeBuild 上失败 我们绝望的做法也不起作用 build commands chmod
  • 如何将除 Web API 之外的所有内容路由到 /index.html

    我一直在研究一个AngularJS项目 在 ASP NET MVC 内部使用 Web API 除非您尝试直接访问有角度的路由 URL 或刷新页面 否则它效果很好 我认为这将是我可以处理的事情 而不是胡闹服务器配置MVC的路由引擎 当前的We
  • 客户端可以看到服务器端源代码吗? ASP.NET

    我想知道使用任何浏览器的任何客户端是否可以看到我的服务器端代码 如果是这样 我怎样才能防止这种情况发生 实际上 客户在访问我的网站时能够看到什么 asp net 我以前从未使用过 asp net 但我认为它与 PHP 或 Perl 相同 客
  • 在 .NET Core 集成测试中查找我的 ConnectionString

    我正在为我的 NET Core 项目构建自动化集成测试 不知何故 我需要访问集成测试数据库的连接字符串 新的 net core不再有ConfigurationManager 而是注入配置 但是没有办法 至少我不知道 将连接字符串注入到测试类
  • EntityFramework.dll 中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理

    我正在尝试为部门名称制作下拉列表 我正在使用MVC5 我看到了太多关于堆栈溢出的解决方案 但我从未找到与 MVC5 相关的有价值的解决方案 Database Name AppraisalDBContext Table Name Depart
  • WCF - 如何增加消息大小配额

    我有一个 WCF 服务 它将 1000 条记录从数据库返回给客户端 我有一个 ASP NET WCF 客户端 我在 asp net Web 应用程序项目中添加了服务引用来使用 WCF 当我运行客户端应用程序时 我收到以下消息 传入消息的最大
  • 自动 IIS6 403.4 重定向到 SSL 不起作用

    我的 ASP Net 网站中有一个目录需要启用 SSL 对于所有其他目录 我不希望启用 SSL 使用 IIS 我为我想要需要 SSL 的文件夹选中了 需要安全通道 SS 和 128 位加密复选框 现在 当用户在我的安全目录中输入 http
  • 如何解决 服务器错误?

    我在 Visual Studio 中制作了一个 ASP NET 应用程序 当它准备好后 我做了 发布网站 我将创建的文件夹放在我的网站上 当我访问网站上的应用程序时 出现以下错误 应用程序中的服务器错误 配置错误 描述 处理服务此请求所需的
  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • C# SignalR 异常 - 连接在收到调用结果之前开始重新连接

    我正在开发 2 个应用程序 第一个是 C 控制台应用程序 另一个是 Asp net Web 应用程序 我正在使用 SignalR 连接两者 这是我的 C 控制台应用程序 客户端 public class RoboHub public sta
  • AWS DMS 无法截断 SQL 事务日志

    我们正在运行 AWS DMS 以 SQL 作为源 以 DynamoDB 作为目标 我们很难截断事务日志 我们看到每个 AWS DMS 有 2 个 SQL 任务 如下所示 begin transaction WVGLQ7HFWFWJCCPK4
  • 从表单发布触发 AWS Lambda

    我创建了一个小型 AWS Lambda 它使用 SES 发送电子邮件 我正在寻找将联系我们表单从静态网站连接到此 lambda 是否可以将联系我们表单直接发布到 lambda 的 url 我没有使用服务器端框架 并且真的想避免它 我有什么选
  • 找不到 IIS Express 静态文件

    首先我要说的是 我有 Linux 背景 在 Windows 上进行开发对我来说相当陌生 我正在开发一个在 Visual Studio 中打开的 ASP NET 项目 该项目最初设置为通过 IIS 运行 VS 主动询问我是否愿意尝试 IIS
  • C# NetworkStream.Read 奇怪之处

    谁能指出这段代码中的缺陷吗 我正在使用 TcpClient 检索一些 HTML 与 IIS 服务器通信时 NetworkStream Read 似乎永远不会完成 如果我改用 Fiddler 代理 它可以正常工作 但是当直接与目标服务器对话时
  • 果园:自定义注册字段

    对于我的 Orchard 项目 我需要用户在注册时提供一些附加信息 说 名字 姓氏 裤子颜色 此信息必须在注册时输入 并且不能推迟到以后 根据客户的订单 我尝试使用配置文件和扩展注册插件来请求这些 但据我所知 这只为我提供了在注册表中显示的
  • nginx server_name 在流块内可能吗?

    目前设置如下 stream server listen 9987 udp server name subdomain EXAMPLE com this line is resulting in an error proxy pass loc
  • 如果是持久(保持活动)连接,为什么我会在 Web 请求中到达 endOfStream?

    我有一个网络请求 它创建与服务器的持久 保持活动 连接 例如 webRequest ContentType application x www form urlencoded Set the ContentLength property o
  • 如何使用 iTextSharp 设置 PDF 段落或字体行高?

    如何使用 iTextSharp 更改 PDF 字体或段落的行高 排版中的行距称为行距 如果可以使用行间距 则可以使用 Paragraph Leading 或 Paragraph LeadingMultiplier 看http itextsh

随机推荐

  • 连锁承诺并保留“这个”

    我有一个点击处理程序 需要一个接一个地进行多个异步调用 我选择使用承诺来构建这些调用 RSVP https github com tildeio rsvp js 准确地说 下面 您可以看到clickA处理程序 在控制器内部 这是一个 Emb
  • 错误:该元素具有 type 属性以及匿名子类型

    具有 type 属性的嵌套复杂 XSD 元素 只是想弄清楚为什么 XSD 中的复杂元素不能有类型属性和嵌套的复杂元素 毕竟类型只是用户定义的数据类型 因此应该能够包含任何内容 包括其他用户定义的数据类型 XSD 解析器抛出错误 该元素具有
  • ggplot2:标签表达式中的字体样式

    更改字体和大小效果很好 无需在标签中表达 这是我在更改标签表达式中的字体时遇到问题的代码 p lt ggplot data mtcars aes x wt y mpg geom point labs x Weight y expressio
  • androidx.work.impl.WorkManagerInitializer:java.lang.ClassNotFoundException:路径上的“androidx.work.impl.WorkManagerInitializer”:/data

    我最近将旧应用程序的后台服务迁移到工作经理 https developer android com topic libraries architecture workmanager 在最近的设备上 低至包含 SDK 22 看起来不错 运行重
  • 解封时出现属性错误:无法获取属性“位置”

    我正在为库存系统编写 Python CGI 脚本 需要通过存储pickle一个列表 称为locations 的对象 这是我正在使用的代码 try with open config autosave bin rb as dataFile lo
  • 整数分数约简算法

    这来源于最近完成的一次编程比赛 给你两个 10 5 整数的数组 范围在 1 10 7 含 内 int N 100000 int D 100000 想象有理数 X 是 N 的所有元素相乘并除以 D 的所有元素的结果 修改两个数组而不更改 X
  • Bootstrap 3 导航栏 - 无法正确折叠

    导航栏曾经正常工作 但我做了一些更改 它不再工作 当我将窗口缩小时 会显示切换方块 但是当我单击它时 什么也没有发生 Note 导航栏在全屏下工作正常 它只是在小窗口中 当我单击切换按钮时 下拉菜单不会出现 想知道是否有人知道如何解决它 这
  • 无法在 Eclipse 上调试基于 Android 库构建的 Android 本机代码

    我已经为此苦苦挣扎了三天 但无法完成 我有一个 android 项目 它链接到 eclipse 上的 android 库 其中包含本机代码 I saw 这个问题 https stackoverflow com questions 12638
  • pandas - 获取日期时间数据框中每天的第一个和最后一个值

    我有一个月的数据框 不包括周六和周日 每 1 分钟记录一次 v1 v2 2017 04 03 09 15 00 35 7 35 4 2017 04 03 09 16 00 28 7 28 5 2017 04 03 16 29 00 81 7
  • 处理表中的溢出

    如果我有一个像这样非常非常简单的例子的表 table table layout fixed width 300px td1 width 100px td2 width 200px 在我的其中之一 td2包含一个图像 可以说 300px in
  • C++ 删除静态数据

    如果我有一个类 其中包含分配在堆上且永不更改的私有静态数据 那么我应该什么时候 如果有的话 删除它 据我了解 类本身永远不会被构造 因为类不是 C 中的第一类对象 那么没有析构函数来删除其中的静态数据 我是 C 新手 如果我对 C 的理解有
  • 如何使用logstash插件-logstash-input-http

    我正在探索 Logstash 以接收 HTTP 上的输入 我已经使用以下方式安装了 http 插件 插件安装logstash input http 安装成功 然后我尝试使用以下命令运行logstash Logstash e 输入 http
  • R:Tibble 与 ggplot2(绘制图表)

    我正在尝试遵循 R 中的教程 https rviews rstudio com 2017 09 25 survival analysis with r https rviews rstudio com 2017 09 25 survival
  • 当用户调整 QMainWindow 大小时如何分配回调?

    我既无法在 QMainWindow 上找到类似教程的调整大小事件方案 也没有在 Qt 设计窗口的下拉菜单中看到任何用于添加调整大小事件的选项 我是 Qt 新手 我想为 QMainWindow 调整大小事件编写一个槽函数 有这样的活动吗 我怎
  • 在 Excel 中设置 csv 文件格式

    Win XP Excel 2007 我知道还有很多关于 csv 格式的其他帖子 但无法找到我需要的内容 我们的一些数据被另一家公司保存在异地 他们每天早上都会向我们发送包含前几天数据的 csv 文件 问题是这些数据来自可能具有下拉列表的网络
  • 使用sync_imports()在IPython.parallel引擎上导入自定义模块

    我一直在玩 IPython parallel 我想使用我自己的一些自定义模块 但无法按照上的说明进行操作烹饪书 http ipython org ipython doc stable parallel parallel multiengin
  • Nifty Modal - 如何在没有按钮的情况下触发模式

    这个脚本 http stuff wp dreams com modal 提供了很棒的模式转换 我想使用它们而不是标准的警报消息 现在脚本的演示展示了如何通过按 a 来触发它们
  • 如何从 R 读取换行符分隔的 JSON 文件?

    我有一个换行符分隔 即每个 JSON 对象仅限于文件中的 1 行 name json1 name json2 name json3 在Python中 我可以轻松地阅读它 如下所示 我必须使用编码encoding cp850 读取我的真实数据
  • IllegalStateException:数据库已关闭(使用 ViewPager)

    我对导致此错误的原因感到困惑 因为我已确保正确关闭数据库适配器 至少我认为是 以下是 LogCat 的说法 所有这些标签的标签都是 AndroidRuntime 致命异常 主要 java lang IllegalStateException
  • 从 ASP.NET Core Web API 将多 GB 文件流式传输到 AWS S3

    我希望通过 ASP NET Core Web API 在 AWS S3 存储桶中创建一个大型 多 GB 文件 该文件足够大 我不想加载Stream在将其上传到 AWS S3 之前先将其存储到内存中 Using PutObjectAsync