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

时间:2018-04-23 20:47:56

标签: c# .net-core aws-sdk

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

以下是用例:

能够向SQL服务器提交查询并将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));
            }
        }

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

任何帮助都将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

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