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 的方法。这表明变量otherApiClientType不是HttpClient

您需要检查可以传递给 UploadPictureAsync 的其他参数,并了解如何使用 fileResponse.Headers

中的值传递自定义标头

【讨论】:

以上是关于HttpClient 从 URL 下载图片然后上传图片的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Firebase 上传图片的图片下载 URL 转换为 base64

java 怎么根据httpPost 和httpClient 等,传图片到服务器!

如何从 Firebase 存储中获取调整大小的图片下载 URL

小心 HttpClient 中的 FormUrlEncodeContent 的 bug

使用flutter将多张图片上传到firestore并获取它的下载URL并将所有URL保存到firebase

论httpclient上传带参数commons-httpclient和apache httpclient区别