翼度科技»论坛 编程开发 .net 查看内容

HttpClient获取图片并保存到本地

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
1. FileDownLoad.cs

本次测试使用HttpClient从网站下载图片并保存到本地,在FileDownLoad类中提供DownLoadInBackGround接口,供外部调用,封装具体的下载操作。
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Net.Http;
  5. using System.Threading.Tasks;
  6. namespace CSProject
  7. {
  8.     public delegate void DownLoadMethodInvoker(bool ret, string URL, string fullfilename);
  9.     //处理下载回调,后期可以作为下载接口的外部参数,提供给外部调用者处理下载后的操作
  10.     public class FileDownLoad
  11.     {
  12.         private static string PATH = "E:/VSWorkspace/CSharp/CSProject/CSProject/Data/Images/";//本地地址
  13.         private static FileDownLoad instance = null;
  14.         private static HttpClient httpClient = null;
  15.         private static HttpClientHandler httpClientHandler = null;
  16.         public static FileDownLoad Instance
  17.         {
  18.             get
  19.             {
  20.                 if(instance == null)
  21.                 {
  22.                     instance = new FileDownLoad();
  23.                     //设置相关的参数
  24.                     httpClientHandler = new HttpClientHandler()
  25.                     {
  26.                         MaxConnectionsPerServer = 10,
  27.                         MaxAutomaticRedirections = 10,
  28.                     };
  29.                     httpClient = new HttpClient(httpClientHandler)
  30.                     {
  31.                         Timeout = TimeSpan.FromSeconds(10),
  32.                     };
  33.                 }
  34.                 return instance;
  35.             }
  36.         }
  37.         //下载接口,供外部调用
  38.         public void DownLoadInBackGround(string URL, string filename)
  39.         {
  40.             if (!string.IsNullOrEmpty(URL))
  41.             {
  42.                 Task.Factory.StartNew(async () => await DownLoadAsync(URL, filename, DownLoadCallBack));
  43.             }
  44.         }
  45.         //Callback也可以设置为DownLoadInBackGround接口的参数,直接使用调用者的Callback
  46.         private void DownLoadCallBack(bool ret, string URL, string fullfilename)
  47.         {
  48.             if (!ret)
  49.             {
  50.                 Console.WriteLine("Download result = " + ret);
  51.                 Console.WriteLine($"URL = {URL},LocalPath = {fullfilename}");
  52.                 return;
  53.             }
  54.         }
  55.         private async Task DownLoadAsync(string URL, string filename, DownLoadMethodInvoker callback)
  56.         {
  57.             Console.WriteLine("URL = " + URL);
  58.             try
  59.             {
  60.                 using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, URL))
  61.                 {
  62.                     using (HttpResponseMessage response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
  63.                     {
  64.                         long? contentLength = 0;
  65.                         if ((int)response.StatusCode >= 400 && (int)response.StatusCode < 600)
  66.                         {
  67.                             Console.WriteLine("Error statuscode = " + response.StatusCode);
  68.                             return;
  69.                         }
  70.                         try
  71.                         {
  72.                             response.EnsureSuccessStatusCode();
  73.                             contentLength = response.Content.Headers.ContentLength;
  74.                             Console.WriteLine("ContentLength = " + response?.Content?.Headers?.ContentLength);
  75.                             int bufferSize = contentLength > 0 ? (int)contentLength : 1024 * 100;//默认100KB以下
  76.                             byte[] buffer = new byte[bufferSize + 1024 * 2];//添加2KB冗余空间
  77.                             buffer = await response.Content.ReadAsByteArrayAsync();
  78.                             //将读取到的内容写进本地文件
  79.                             using (FileStream fileStream = new FileStream(PATH + filename, FileMode.Create))
  80.                             {
  81.                                 Console.WriteLine("Read file complete, filesize = " + bufferSize);
  82.                                 fileStream.Write(buffer, 0, bufferSize);
  83.                                 Console.WriteLine("Write End, URL = " + URL);
  84.                             }
  85.                             callback?.Invoke(true, URL, PATH + filename);
  86.                         }
  87.                         catch (Exception ex)
  88.                         {
  89.                             Console.WriteLine("exception = " + ex.Message);
  90.                             callback?.Invoke(false, URL, PATH + filename);
  91.                         }
  92.                     }
  93.                 }
  94.             }
  95.             catch (Exception ex)
  96.             {
  97.                 Console.WriteLine("Exception = " + ex.Message);
  98.                 callback?.Invoke(false, URL, PATH + filename);
  99.             }
  100.         }
  101.     }
  102. }
复制代码
2. FileDownLoadTC.cs

编写测试类FileDownLoadTC,提供测试方法,并调用之前实现的下载接口
[code]using System;namespace CSProject{    public class FileDownLoadTC    {        private static FileDownLoadTC instance;        public static FileDownLoadTC Instance        {            get            {                if(instance == null)                {                    instance = new FileDownLoadTC();                }                return instance;            }        }        public void Test()        {            //图片位置:https://img.infinitynewtab.com/wallpaper/            for (int i = 1; i
来自手机

举报 回复 使用道具