从 URL 获取图像并上传到 Amazon S3
Get image from URL and upload to Amazon S3
我想直接从 URL 加载图像,但不将其保存在服务器上,我想直接从内存将其上传到 Amazon S3 服务器。
这是我的代码:
Dim wc As New WebClient
Dim fileStream As IO.Stream = wc.OpenRead("http://www.domain.com/image.jpg")
Dim request As New PutObjectRequest()
request.BucketName = "mybucket"
request.Key = "file.jpg"
request.InputStream = fileStream
client.PutObject(request)
Amazon API 给我错误 "Could not determine content length"。流 fileStream 以 "System.Net.ConnectStream" 结束,我不确定它是否正确。
完全相同的代码适用于 HttpPostedFile 中的文件,但我现在需要以这种方式使用它。
关于如何将流转换为 Amazon API 所期望的内容(长度不变)有什么想法吗?
我在使用 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);
扩展方法
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;
}
我在类似情况下遇到了同样的问题。
错误的原因是要上传 object SDK 需要知道将要上传的整个内容长度。为了能够获得流长度,它必须是可搜索的,但从 WebClient 返回的流不是。在 PutObjectRequest 中指示预期长度设置 Headers.ContentLength。如果 SDK 无法确定流 object.
的长度,则将使用此值
要使您的代码正常工作,请从 WebClient 调用返回的响应 headers 中获取内容长度。然后设置 PutObjectRequest.Headers.ContentLength。当然这取决于服务器返回的内容长度值。
Dim wc As New WebClient
Dim fileStream As IO.Stream = wc.OpenRead("http://www.example.com/image.jpg")
Dim contentLength As Long = Long.Parse(client.ResponseHeaders("Content-Length"))
Dim request As New PutObjectRequest()
request.BucketName = "mybucket"
request.Key = "file.jpg"
request.InputStream = fileStream
request.Headers.ContentLength = contentLength
client.PutObject(request)
我想直接从 URL 加载图像,但不将其保存在服务器上,我想直接从内存将其上传到 Amazon S3 服务器。
这是我的代码:
Dim wc As New WebClient
Dim fileStream As IO.Stream = wc.OpenRead("http://www.domain.com/image.jpg")
Dim request As New PutObjectRequest()
request.BucketName = "mybucket"
request.Key = "file.jpg"
request.InputStream = fileStream
client.PutObject(request)
Amazon API 给我错误 "Could not determine content length"。流 fileStream 以 "System.Net.ConnectStream" 结束,我不确定它是否正确。
完全相同的代码适用于 HttpPostedFile 中的文件,但我现在需要以这种方式使用它。
关于如何将流转换为 Amazon API 所期望的内容(长度不变)有什么想法吗?
我在使用 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);
扩展方法
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;
}
我在类似情况下遇到了同样的问题。
错误的原因是要上传 object SDK 需要知道将要上传的整个内容长度。为了能够获得流长度,它必须是可搜索的,但从 WebClient 返回的流不是。在 PutObjectRequest 中指示预期长度设置 Headers.ContentLength。如果 SDK 无法确定流 object.
的长度,则将使用此值要使您的代码正常工作,请从 WebClient 调用返回的响应 headers 中获取内容长度。然后设置 PutObjectRequest.Headers.ContentLength。当然这取决于服务器返回的内容长度值。
Dim wc As New WebClient
Dim fileStream As IO.Stream = wc.OpenRead("http://www.example.com/image.jpg")
Dim contentLength As Long = Long.Parse(client.ResponseHeaders("Content-Length"))
Dim request As New PutObjectRequest()
request.BucketName = "mybucket"
request.Key = "file.jpg"
request.InputStream = fileStream
request.Headers.ContentLength = contentLength
client.PutObject(request)