当我使用
GetObjectResponse()方法及其属性
ResponseStream将文件从一个文件夹复制到另一个文件夹时,我遇到了同样的问题。我注意到AWS SDK(2.3.45)存在一些缺陷,例如另一个名为
WriteResponseStreamToFile的方法在
GetObjectResponse()中根本无法工作。这些缺失的功能需要一些解决方法。
我通过打开文件并将其放入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);
The extesion method
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;
}
request.Headers.ContentLength = long.Parse(client.ResponseHeaders.Get("Content-Length"));
- herostwist