HttpClient获取图片并保存到本地

1. FileDownLoad.cs

本次测试使用HttpClient从网站下载图片并保存到本地,在FileDownLoad类中提供DownLoadInBackGround接口,供外部调用,封装具体的下载操作。

using System;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

namespace CSProject
{
    public delegate void DownLoadMethodInvoker(bool ret, string URL, string fullfilename);
    //处理下载回调,后期可以作为下载接口的外部参数,提供给外部调用者处理下载后的操作
    public class FileDownLoad
    {
        private static string PATH = "E:/VSWorkspace/CSharp/CSProject/CSProject/Data/Images/";//本地地址
        private static FileDownLoad instance = null;
        private static HttpClient httpClient = null;
        private static HttpClientHandler httpClientHandler = null;
        public static FileDownLoad Instance
        {
            get
            {
                if(instance == null)
                {
                    instance = new FileDownLoad();
                    //设置相关的参数
                    httpClientHandler = new HttpClientHandler()
                    {
                        MaxConnectionsPerServer = 10,
                        MaxAutomaticRedirections = 10,
                    };
                    httpClient = new HttpClient(httpClientHandler)
                    {
                        Timeout = TimeSpan.FromSeconds(10),
                    };
                }
                return instance;
            }
        }
        //下载接口,供外部调用
        public void DownLoadInBackGround(string URL, string filename)
        {
            if (!string.IsNullOrEmpty(URL))
            {
                Task.Factory.StartNew(async () => await DownLoadAsync(URL, filename, DownLoadCallBack));
            }
        }

        //Callback也可以设置为DownLoadInBackGround接口的参数,直接使用调用者的Callback
        private void DownLoadCallBack(bool ret, string URL, string fullfilename)
        {
            if (!ret)
            {
                Console.WriteLine("Download result = " + ret);
                Console.WriteLine($"URL = {URL},LocalPath = {fullfilename}");
                return;
            }
        }

        private async Task DownLoadAsync(string URL, string filename, DownLoadMethodInvoker callback)
        {
            Console.WriteLine("URL = " + URL);
            try
            {
                using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, URL))
                {
                    using (HttpResponseMessage response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
                    {
                        long? contentLength = 0;
                        if ((int)response.StatusCode >= 400 && (int)response.StatusCode < 600)
                        {
                            Console.WriteLine("Error statuscode = " + response.StatusCode);
                            return;
                        }
                        try
                        {
                            response.EnsureSuccessStatusCode();
                            contentLength = response.Content.Headers.ContentLength;
                            Console.WriteLine("ContentLength = " + response?.Content?.Headers?.ContentLength);

                            int bufferSize = contentLength > 0 ? (int)contentLength : 1024 * 100;//默认100KB以下
                            byte[] buffer = new byte[bufferSize + 1024 * 2];//添加2KB冗余空间
                            buffer = await response.Content.ReadAsByteArrayAsync();
                            //将读取到的内容写进本地文件
                            using (FileStream fileStream = new FileStream(PATH + filename, FileMode.Create))
                            {
                                Console.WriteLine("Read file complete, filesize = " + bufferSize);
                                fileStream.Write(buffer, 0, bufferSize);
                                Console.WriteLine("Write End, URL = " + URL);
                            }
                            callback?.Invoke(true, URL, PATH + filename);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("exception = " + ex.Message);
                            callback?.Invoke(false, URL, PATH + filename);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception = " + ex.Message);
                callback?.Invoke(false, URL, PATH + filename);
            }
        }
    }
}

2. FileDownLoadTC.cs

编写测试类FileDownLoadTC,提供测试方法,并调用之前实现的下载接口

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 <= 300; i++)
            {
                string URL = "https://img.infinitynewtab.com/wallpaper/" + i + ".jpg";
                FileDownLoad.Instance.DownLoadInBackGround(URL, i.ToString("D3") + ".jpg");
            }
        }
    }
}

3. Program.cs

调用测试方法

using System;

namespace CSProject
{
    internal class Program
    {
        static void Main(string[] args)
        {
            FileDownLoadTC.Instance.Test();
            Console.ReadLine();
        }
    }
}
posted @ 2024-08-28 00:37  Vickers~  阅读(289)  评论(0编辑  收藏  举报