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。
我正在测试如何使用 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。