当我使用 GetObjectResponse() 方法及其属性 ResponseStream 将文件从文件夹复制到同一存储桶中的另一个时,我遇到了同样的问题。我注意到 AWS 开发工具包 (2.3.45) 有一些故障,例如在 GetObjectResponse() 中称为 WriteResponseStreamToFile 的另一种方法根本不起作用。这些功能缺失需要一些变通方法。
我解决了以字节数组打开文件并将其放入 MemoryStream 对象的问题。
试试这个(C# 代码)
WebClient wc = new WebClient();
Stream fileStream = wc.OpenRead("http://www.domain.com/image.jpg");
byte[] fileBytes = fileStream.ToArrayBytes();
PutObjectRequest request = new PutObjectRequest();
request.BucketName = "mybucket";
request.Key = "file.jpg";
request.InputStream = new MemoryStream(fileBytes);
client.PutObject(request);
扩展方法
public static byte[] ToArrayBytes(this Stream input)
{
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
你也可以创建一个没有字节数组的 MemoryStream。但是在 S3 中的第一个 PutObject 之后,MemoryStream 将被丢弃。如果你需要放置其他对象,我推荐第一个选项
WebClient wc = new WebClient();
Stream fileStream = wc.OpenRead("http://www.domain.com/image.jpg");
MemoryStream fileMemoryStream = fileStream.ToMemoryStream();
PutObjectRequest request = new PutObjectRequest();
request.BucketName = "mybucket";
request.Key = "file.jpg";
request.InputStream = fileMemoryStream ;
client.PutObject(request);
扩展方法
public static MemoryStream ToMemoryStream(this Stream input)
{
byte[] buffer = new byte[16 * 1024];
int read;
MemoryStream ms = new MemoryStream();
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms;
}