在仍然生成流的情况下,使用PutObjectRequest写入S3

时间:2018-08-17 19:21:56

标签: c# amazon-web-services amazon-s3 streamwriter

我正在转换一个当前使用Windows文件系统读取和存储文件的应用程序。

在读取输入文件的每一行时,它会修改数据,然后将其写到输出文件中:

using (var writer = new StreamWriter(@"C:\temp\out.txt", false))
{
    using (var reader = new StreamReader(@"C:\temp\in.txt", Encoding.UTF8))
    {
        while ((line = reader.ReadLine()) != null)
        {
            //Create modifiedLine from line data
            ...
            writer.WriteLine(modifiedLine);
        }
    }
}

到目前为止,我已经能够使用PutObjectRequest写入S3,但是一次只能写入整个文件内容:

//Set up stream
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(theEntireModifiedFileContents);
writer.Flush();
stream.Position = 0;

var putRequest = new PutObjectRequest()
{
    BucketName = destinationBucket,
    Key = destinationKey,
    InputStream = stream
};

var response = await s3Client.PutObjectAsync(putRequest);

鉴于这些文件将是大文件,我宁愿保持逐行处理的方式,而不必一次发送整个文件的内容。

有什么方法可以保持与上面使用S3的文件系统示例类似的行为?

1 个答案:

答案 0 :(得分:0)

S3是一个对象存储,不支持就地修改,附加等。

但是,如果满足/理解某些标准,就有可能实现您的目标:

1)意识到,要完成此操作比简单地修改代码来缓冲行输出然后作为单个对象上载要花费更多的代码。

2)您可以上载每行作为REST API PUT流的一部分。这意味着您将需要连续上传数据直到完成。基本上,在处理每一行时,您正在缓慢地上传单个S3对象。

3)您可以使用多部分API将每一行作为多部分传输的一部分上传。然后将零件合并完成。注意:我不记得每个部分的大小是否必须相同(最后一个部分除外)。零件总数的限制为1,000。如果行数超过1,000,则需要缓冲,因此请返回方法1或添加缓冲以将零件数减少至1,000。

除非您是一个真正有动力的开发人员,否则请认识到方法1的实现和测试将容易得多。方法2和方法3将要求您了解使用HTTP PUT请求的S3的工作原理。