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

时间:2016-04-19 02:15:42

标签: c# amazon-web-services amazon-s3 filestream aws-sdk

我正在测试如何使用带有来自网络应用的示例.txt文件的SDK上传到AWS。文件上传到Bucket,但是从存储桶下载的文件只是一个空的记事本文档,没有原始上传文件中的文本。我刚接触溪流,所以我不确定这里有什么问题。有谁知道为什么数据不会在转移请求中发送?提前谢谢!

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();
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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