У меня была такая же проблема, когда я использую метод 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);
Метод extesion
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 без массива байтов. Но после первого PutObject в S3 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);
Метод extesion
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;
}
Это должен быть лучший ответ. Это не связано с копированием потока памяти. Все, что мне нужно было сделать, это добавить одну строку, чтобы удалить ошибку. (C#) 'request.Headers.ContentLength = long.Parse (client.ResponseHeaders.Get (" Content-Length "));' – herostwist