3

사용 Windows.Web.Http.HttpClient 어떻게 이미지를 다운로드 할 수 있습니까? 이 클래스는 휴대용 클래스 라이브러리에서 사용할 수 있기 때문에이 HttpClient를 사용하고 싶습니다.Windows.Web.Http의 새 HttpClient를 사용하여 이미지를 다운로드하는 방법은 무엇입니까?

+0

지금 당신이 행복하지 않다는 것을 명심하십시오. 이미지 컨트롤이 제공하는 자동 이미지 캐싱에서 적합합니다. –

+0

@DecadeMoon 웹에서 Uri를 직접 가리킬 수 있습니까? 위와 같이 설정 될 때 Uri에 대한 오류가 발생했습니다 (아래에서 사용 된 것과 동일한 Uri!). 이미지는 그냥 비어 있지만 이미지로드 실패 이벤트를 추가하고 예외를 살펴 본다면 그 오류를 볼 수 있습니다 ... 나는 또한 그것이 가능하지 않다고 말할 수있는 몇 가지 기사를 읽었지만 아마 작동하지 않았습니다. 그것을 밖으로 ... –

+0

예, 일반적으로 당신은 단지 Uri를 직접 가리킬 것입니다. 이미지가로드되지 않는 것은 이상한 일입니다. 다른 이미지 URI를 사용해 보셨습니까? 예외는 무엇을 말 했습니까? –

답변

6

이것은 내가 결국 생각해 낸 것입니다. 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; 
    } 
} 
+0

고마워요. –

+0

그냥 FYI : UI를 차단하지 않는 것이 더 좋은 SetSourceAsync 메서드도 있습니다. –

+1

@Jeroen Vannevel 최고의 조언이 아닙니다. -> https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Morpheus

0

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; 
    } 
2
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; 
      } 
     } 
} 
1

당신이 아래의 코드 여기

[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 입력 매개 변수가있는 클래스입니다