|
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,提供测试方法,并调用之前实现的下载接口
[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 |
|