我正在测试如何使用带有来自网络应用的示例.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();
}
}
答案 0 :(得分:0)
很可能TransferUtility对临时上传文件不起作用。尝试将输入流复制到某个地方(例如,将其复制到其他不那么临时的文件中,如果你确定确定,它会在某些时候没有给你OutOfMemory)。另一件事是摆脱TransferUtility并使用低级AmazonS3Client.PutObject,您可以使用它来更好地控制Stream生命周期(不要忘记您需要实现一些重试,因为S3 API很容易返回随机临时错误)。
答案 1 :(得分:0)
答案与嵌套有关,这仍然有点超出我的理解,并不是因为这里发布的代码本质上是错误的。此代码位于初始StreamReader之后,它检查文本文件的第一行以确定是否保存文件。将代码从执行ReadLines的while循环移出后,上传工作正常。一切正常,因为它现在应该重新组织验证,这样就不需要嵌套的Stream或MemoryStream。