사용 Windows.Web.Http.HttpClient
어떻게 이미지를 다운로드 할 수 있습니까? 이 클래스는 휴대용 클래스 라이브러리에서 사용할 수 있기 때문에이 HttpClient를 사용하고 싶습니다.Windows.Web.Http의 새 HttpClient를 사용하여 이미지를 다운로드하는 방법은 무엇입니까?
답변
이것은 내가 결국 생각해 낸 것입니다. Windows.Web.Http.HttpClient
주위에 많은 문서가 없으며이 예제에서는 온라인에서 HttpClient와 함께 사용할 수없는 ReadAllBytesAsync와 같은 이전 메커니즘을 사용합니다.
나는 this question from MSDN이 나를 많이 도와 주므로, 그 사람 덕택입니다. 저기서의 논평으로서,이 사람은 Windows.Web.Http
를 알고있는 세계의 유일한 사람이되어야합니다!
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using Windows.Storage.Streams;
using Windows.Web.Http;
public class ImageLoader
{
public async static Task<BitmapImage> LoadImage(Uri uri)
{
BitmapImage bitmapImage = new BitmapImage();
try
{
using (HttpClient client = new HttpClient())
{
using (var response = await client.GetAsync(uri))
{
response.EnsureSuccessStatusCode();
using (IInputStream inputStream = await response.Content.ReadAsInputStreamAsync())
{
bitmapImage.SetSource(inputStream.AsStreamForRead());
}
}
}
return bitmapImage;
}
catch (Exception ex)
{
Debug.WriteLine("Failed to load the image: {0}", ex.Message);
}
return null;
}
}
고마워요. –
그냥 FYI : UI를 차단하지 않는 것이 더 좋은 SetSourceAsync 메서드도 있습니다. –
@Jeroen Vannevel 최고의 조언이 아닙니다. -> https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Morpheus
8.1에 대한 업데이트 - (10)
.NET 핵심 웹 API의public async static Task<BitmapImage> LoadImage(Uri uri)
{
BitmapImage bitmapImage = new BitmapImage();
try
{
using (Windows.Web.Http.HttpClient client = new Windows.Web.Http.HttpClient())
{
using (var response = await client.GetAsync(uri))
{
response.EnsureSuccessStatusCode();
using (MemoryStream inputStream = new MemoryStream())
{
await inputStream.CopyToAsync(inputStream);
bitmapImage.SetSource(inputStream.AsRandomAccessStream());
}
}
}
return bitmapImage;
}
catch (Exception ex)
{
Debug.WriteLine("Failed to load the image: {0}", ex.Message);
}
return null;
}
public async void downLoadImage(string url)
{
using (var client = new HttpClient())
{
var response = client.GetAsync(url).Result;
BitmapImage bitmap = new BitmapImage();
if (response != null && response.StatusCode == HttpStatusCode.OK)
{
using (var stream = await response.Content.ReadAsStreamAsync())
{
using (var memStream = new MemoryStream())
{
await stream.CopyToAsync(memStream);
memStream.Position = 0;
bitmap.SetSource(memStream.AsRandomAccessStream());
}
}
HardcodedValues.profilePic = bitmap;
}
}
}
당신이 아래의 코드 여기
[Route("getProductImage/v1")]
[HttpGet]
public async Task<IActionResult> getProductImage(GetProductImageQueryParam parammodel)
{
using (HttpClient client = new HttpClient())
{
MNimg_URL = MNimg_URL + parammodel.modelname;
HttpResponseMessage response = await client.GetAsync(MNimg_URL);
byte[] content = await response.Content.ReadAsByteArrayAsync();
//return "data:image/png;base64," + Convert.ToBase64String(content);
return File(content, "image/png", parammodel.modelname);
}
}
을 사용할 수 있습니다 GetProductImageQueryParam 입력 매개 변수가있는 클래스입니다
지금 당신이 행복하지 않다는 것을 명심하십시오. 이미지 컨트롤이 제공하는 자동 이미지 캐싱에서 적합합니다. –
@DecadeMoon 웹에서 Uri를 직접 가리킬 수 있습니까? 위와 같이 설정 될 때 Uri에 대한 오류가 발생했습니다 (아래에서 사용 된 것과 동일한 Uri!). 이미지는 그냥 비어 있지만 이미지로드 실패 이벤트를 추가하고 예외를 살펴 본다면 그 오류를 볼 수 있습니다 ... 나는 또한 그것이 가능하지 않다고 말할 수있는 몇 가지 기사를 읽었지만 아마 작동하지 않았습니다. 그것을 밖으로 ... –
예, 일반적으로 당신은 단지 Uri를 직접 가리킬 것입니다. 이미지가로드되지 않는 것은 이상한 일입니다. 다른 이미지 URI를 사용해 보셨습니까? 예외는 무엇을 말 했습니까? –