代码之家  ›  专栏  ›  技术社区  ›  jkh

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

  •  0
  • jkh  · 技术社区  · 6 年前

    我正在转换当前使用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 回复  |  直到 6 年前
        1
  •  0
  •   John Hanley    6 年前

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

    1) 要意识到,要做到这一点需要更多的代码,而不仅仅是修改代码以缓冲行输出,然后作为单个对象上载。

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

    3) 将每个部分作为一个单独的API传输到多个部分即可使用。完成后再将零件组合起来。注意:我不记得每个零件是否必须是相同的尺寸(除了最后一个零件)。部件总数的限制为1000。如果您的行数超过需要缓冲的行数1000,请返回方法#1或添加缓冲以将部件数减少到1000。

    除非你是一个真正有动力的开发人员,否则要意识到方法#1将更容易实现和测试。方法#2和#3要求您了解S3如何使用HTTP PUT请求在非常低的级别上工作。