如何在 C# 中将文件直接流式传输到 S3,而不先在本地保存

use*_*534 5 c# aws-sdk .net-core

我是 .Net 编程新手,一直在努力解决如何将文件从 C# (DOTNETCORE 2.+) 流式传输到 S3 而不将其保存在本地。

这是用例:

能够向 SQL Server 提交查询并将 GZipped 分隔文件提取到 S3 存储桶。这需要在 .NETCORE 中进行编码,因为最终目标是在 Linux Docker 容器中运行它。

限制 - 磁盘空间和内存有限,因此无法在本地保存大文件然后将其移动到 S3。

以下代码是我的 .NETCORE 控制台应用程序的一个片段,它将 sqldatareader 的数据写入到本地文件的压缩流中:

        using (SqlConnection conn = new SqlConnection(cs))
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        using (FileStream outFile = File.Create(filepath + filename + fileextension))
        using (GZipStream compress = new GZipStream(outFile, CompressionMode.Compress))
        using (StreamWriter sw = new StreamWriter(compress))
        {
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            StringBuilder sb = new StringBuilder();
            Object[] row = new Object[dr.FieldCount];

            while (dr.Read())
            {
                dr.GetValues(row);
                sw.WriteLine(String.Join(delimiter, row));
            }
        }
Run Code Online (Sandbox Code Playgroud)

.NETCORE AWSSDK 用于公开 Amazon.S3.IO 类,我可以将其用于 outFile 文件流,但 AWS 决定不将其发布到 .NETCORE 2.+。AWS 表示使用 AmazonS3Client 或 TransferUtility。但是,我找不到有关如何在没有本地文件的情况下上传流的示例。

任何帮助,将不胜感激。

谢谢。

use*_*534 -2

我最终创建了一个类,该类在使用 S3 分段上传 API 时返回默认为 10 MB 的流。在该类中,使用内存流,因此可以控制磁盘和内存。

  • 来源会很棒! (4认同)