我是.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。但是,我找不到如何在没有本地文件的情况下上传流的示例。
任何帮助都将不胜感激。
谢谢。
答案 0 :(得分:0)
我使用S3多部分上传API创建了一个返回默认为10 MB的流的类。在该类中,使用内存流,因此可以控制磁盘和内存。