HttpClient 从 URL 下载图片然后上传图片
Posted
技术标签:
【中文标题】HttpClient 从 URL 下载图片然后上传图片【英文标题】:HttpClient Download Image From URL Then Upload Image 【发布时间】:2020-12-18 19:02:22 【问题描述】:我有一个位于 url 中的图像。
https://somecdn/content/myimage.png
我想将此字符串传递给我的 API,将图像下载到内存然后上传到另一个 API。
我正在使用一个 api 客户端,它是从我们的 swagger 生成的,它采用一种 IO.stream 类型。
代码如下:
public async Task<int> UploadPicture(string fileUrl)
var otherApiClient = await _otherApiClient.Build();
var fileRetrievalClient = new HttpClient();
var fileResponse = await fileRetrievalClient.GetAsync(fileUrl);
var newId = await otherApiClient.UploadPictureAsync(file: await fileResponse.Content.ReadAsStreamAsync());
return newId;
通常当通过前端调用时,类型设置正确:
内容配置:表单数据;名称=“文件”;文件名="yadayada.png" 内容类型:image/png
但是在我的代码中 Content-Type 是错误的:
内容类型:application/octet-stream 内容处置:表单数据;名称=文件;文件名=未知
我该如何纠正这个问题?
【问题讨论】:
【参考方案1】:你可以这样做:
var fileResponse = await fileRetrievalClient.GetAsync(fileUrl);
byte[] bytes = await fileResponse.Content.ReadAsByteArrayAsync();
using (var content = new ByteArrayContent(bytes))
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
content.Headers.TryAddWithoutValidation("Content-Disposition", "application/octet-stream name=test");
var postResponse = await otherApiClient.PostAsync(uri, content);
【讨论】:
【参考方案2】:HttpClient 没有名为 UploadPictureAsync 的方法。这表明变量otherApiClient的Type不是HttpClient。
您需要检查可以传递给 UploadPictureAsync 的其他参数,并了解如何使用 fileResponse.Headers
中的值传递自定义标头【讨论】:
以上是关于HttpClient 从 URL 下载图片然后上传图片的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Firebase 上传图片的图片下载 URL 转换为 base64
java 怎么根据httpPost 和httpClient 等,传图片到服务器!
如何从 Firebase 存储中获取调整大小的图片下载 URL
小心 HttpClient 中的 FormUrlEncodeContent 的 bug