HttpPostedFileBase 流上传到 AWS SDK Bucket 没有数据

HttpPostedFileBase Stream Upload to AWS SDK Bucket has no Data

我正在测试如何使用 SDK 将来自 Web 应用程序的示例 .txt 文件上传到 AWS。文件上传到存储桶,但从存储桶下载的文件只是一个空的记事本文档,没有原始上传文件中的文本。我是使用流的新手,所以我不确定这里可能出了什么问题。有谁知道为什么数据不会在传输请求中发送?提前致谢!

using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USWest1))
{
    //Save File to Bucket
    using (FileStream txtFileStream = (FileStream)UploadedHttpFileBase.InputStream)
    {
        try
        {
            TransferUtility fileTransferUtility = new TransferUtility();
            fileTransferUtility.Upload(txtFileStream, bucketLocation, 
                UploadedHttpFileBase.FileName);
        }
        catch (Exception e)
        {
            e.Message.ToString();
        }
    }
}

编辑:

TransferUtility 和 PutObjectRequest/PutObjectResponse/AmazonS3Client.PutObject 都保存了一个空白文本文件。然后,在实例化一个新的 FileStream 遇到一些麻烦之后,将起始位置重置为零后使用的 MemoryStream 仍然保存了一个空白文本文件。有什么想法吗?

新代码:

using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USWest1))
{
    Stream saveableStream = new MemoryStream();
    using (Stream source = (Stream)UploadedHttpFileBase.InputStream)
    {
        source.Position = 0;
        source.CopyTo(saveableStream);
    }

    //Save File to Bucket                                        
    try
    {
        PutObjectRequest request = new PutObjectRequest
        {
            BucketName = bucketLocation,
            Key = UploadedHttpFileBase.FileName, 
            InputStream = saveableStream
        };
        PutObjectResponse response = client.PutObject(request);
    }
    catch (Exception e)
    {
        e.Message.ToString();
    }
}

很可能是 TransferUtility 不适用于临时上传文件。尝试将您的输入流复制到某个地方(例如,复制到其他不太临时的文件中,或者如果您 sure 甚至是 MemoryStream,它在某些时候不会给您 OutOfMemory)。另一件事是摆脱 TransferUtility 并使用低级 AmazonS3Client.PutObject 来更好地控制 Stream 生命周期(不要忘记你需要实现一些重试,因为 S3 API 很容易返回随机临时错误)。

答案与嵌套有关,这仍然有点超出我的理解,而不是因为这里发布的代码本身就是错误的。此代码出现在初始 StreamReader 之后,该 StreamReader 检查文本文件的第一行以确定是否保存文件。在将代码从执行 ReadLines 的 while 循环中移出后,上传成功了。现在一切正常,因为验证已重新组织,因此不需要嵌套 Stream 或 MemoryStream。