首页 > 编程语言 >C#队列、多线程根据URL下载文件

C#队列、多线程根据URL下载文件

时间:2024-12-24 09:33:05浏览次数:7  
标签:string C# URL jo static url new 多线程 attachment

/// <summary>
/// 下载辅助类
/// </summary>
public class DownFileHelper
{
    /// <summary>
    /// 构造函数
    /// </summary>
    static DownFileHelper()
    {
        Start();
    }
    private static object lockObject = new object();
    /// <summary>
    /// 下载对象的队列
    /// </summary>
    private static Queue<FlieWL> ListQueue = new Queue<FlieWL>();

    private static void Start()//启动主线程
    {
        Task.Run(() =>
        {
            threadStart();
        });
    }

    /// <summary>
    /// 常驻线程主方法--死循环保证线程不退出
    /// </summary>
    private static void threadStart()
    {
        while (true)
        {
            if (ListQueue.Count > 0)
            {
                try
                {
                    //线程锁定,一次下一个
                    lock (lockObject)
                    {
                        ScanQueue();
                    }
                }
                catch (Exception ex)
                {
                   
                }
            }
            else
            {
                //没有任务,休息3秒钟再循环
                Thread.Sleep(3000);
            }
        }
    }

    /// <summary>
    /// 要执行的方法主体 
    /// </summary>
    private static void ScanQueue()
    {
        while (ListQueue.Count > 0)
        {
            //从队列中取出一个对象
            FlieWL dwfile = ListQueue.Dequeue();
            DownFile(dwfile,true);
        }
    }

    public static async void DownFile(FlieWL jo,bool isAsync = false)
    {
        using (WebClient client = new WebClient())
        {
            try
            {
                if (jo.url.StartsWith("https"))
                {
                    ServicePointManager.ServerCertificateValidationCallback =
                       delegate { return true; };

                    //.Net4.5级以下框架需要该协议
                    //ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | (SecurityProtocolType)0xC00 //Tls12
                    // | (SecurityProtocolType)0x300; //Tls11
                    //ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                }
                //如果调用的方法需要身份验证则必须加如下请求标头
                if (!string.IsNullOrEmpty(jo.token))
                {

                    client.Headers.Add(HttpRequestHeader.Authorization, string.Format("Bearer {0}", jo.token));
                }

                if (isAsync)
                {
                    await client.DownloadFileTaskAsync(jo.url, jo.savePath);
                }
                else
                {
                    client.DownloadFile(jo.url, jo.savePath);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

    public static void DWFile(FlieWL fileObj)
    {
        ListQueue.Enqueue(fileObj);
    }
}


//方法调用
var files = new List<FlieWL>()
{
    new FlieWL()
    {
        fileName = "test.txt",
        url = "https://img2.wallspic.com/previews/8/1/6/9/7/179618/179618-zhi_zhu_xia-chao_ji_ying_xiong-dian_shi-spider_man_no_way_home-zhi_zhu_xia_hui_jia-550x310.jpg",
        Ext = ".png",
    },
    new FlieWL()
    {
        fileName = "test.txt",
        url = "https://img2.wallspic.com/previews/8/1/6/9/7/179618/179618-zhi_zhu_xia-chao_ji_ying_xiong-dian_shi-spider_man_no_way_home-zhi_zhu_xia_hui_jia-550x310.jpg",
        Ext = ".png",
    }
};
SaveAsAttachment(files, true);
Console.ReadKey();

/// <summary>
/// 保存url文件为附件
/// </summary>
/// <param name="joL"></param>
/// <param name="isThread">采用多线程方式,将无法进行错误阻止</param>
/// <returns></returns>
static string SaveAsAttachment(List<FlieWL> joL, bool isThread = false)
{
    //存放的路径
    string savePath = @"C:\Temp\Attachments\";

    var res = "";
    var listAtt = new List<AttachmentInfo>();
    foreach (var jo in joL)
    {
        AttachmentInfo attachment = new AttachmentInfo();
        listAtt.Add(attachment);
        var fileName = jo.fileName;
        if (string.IsNullOrEmpty(jo.Ext.ToString()))
            throw new Exception("文件扩展名为空。");
        if (string.IsNullOrEmpty(jo.fileName.ToString()))
            throw new Exception("文件名为空。");
        if (string.IsNullOrEmpty(jo.url.ToString()))
            throw new Exception("下载地址为空。");
        string url = Convert.ToString(jo.url);
        string fileId = GetNewFileID();
        //保存文档至目的地
        string filepath = savePath + fileId;
        var dirPath = savePath.Substring(0, savePath.LastIndexOf(@"\"));
        if (!Directory.Exists(dirPath))
            Directory.CreateDirectory(dirPath);
        attachment.FileID = fileId;
        attachment.Ext = jo.Ext.ToString();
        attachment.Name = jo.fileName.ToString();
        res += fileId + ";";
        attachment.LastUpdate = DateTime.Now;
        attachment.OwnerAccount = "TestMember";

        jo.url = url;
        jo.savePath = filepath;
        jo.fileID = fileId;
        attachment.Size = jo.Size;

        if (isThread)
        {
            //加入队列
            DownFileHelper.DWFile(jo);
        }
        else
        {
            DownFileHelper.DownFile(jo, isThread);
        }

        //拿到attachment信息存数据库操作,k保存的文件是没有后缀的,当文件需要预览的时候就可以直接根据ID找到文件拼接上文件后缀
    }
    return res.TrimEnd(';');
}

/// <summary>
/// 获取文件ID
/// </summary>
static string GetNewFileID()
{
    Random random = new();
    return DateTime.Now.ToString("yyyyMMddHHmmss") + random.Next(1, 10000);
}

 

标签:string,C#,URL,jo,static,url,new,多线程,attachment
From: https://www.cnblogs.com/SmallChen/p/18626598

相关文章

  • c语言结构体
    结构体   自定义的数据类型   就是由很多数据组合成的一个整体   每一个数据,都是结构体的成员定义struct结构体名字 { 成员1; 成员2; 。。。}struct GirlFriend{ charname[100]; intage;} 使用structGirlFriend gf1;strcpy(......
  • 【2024最新黑客工具分享】TPscan - 一键ThinkPHP漏洞检测getshell
    0x00工具介绍TPscan是一款基于Python3的ThinkPHP漏洞检测工具。0x01下载链接TPscan下载链接:夸克网盘分享0x02功能介绍thinkphp_checkcode_time_sqli_verifythinkphp_construct_code_exec_verifythinkphp_construct_debug_rce_verifythinkphp_debug_index_......
  • Colyseus 的高效状态同步与增量更新
    在多人在线游戏和实时应用中,状态同步是一个核心挑战。Colyseus通过独特的增量更新机制,显著提高了状态同步的效率。以下是详细的讲解:1.什么是增量更新?完整状态同步:传统方式是每次状态改变后,服务器将完整的状态数据发送给所有客户端。这种方法简单但低效,尤其在状态数据庞大......
  • 2024年AIGC与多模态最佳实践方案(附实践方案下载)
    在AIGC(人工智能生成内容)与多模态技术的最佳实践方案中,我们可以从以下几个方面进行探讨:1.多模态与AIGC的数据管理实践多模态技术能够处理和理解多种类型数据(如文本、图像、音频等),在数据模型管理中,多模态技术可以帮助构建更为复杂和丰富的数据模型,通过整合不同模态的数据来提......
  • 使用CSS3绘制一杯冒热气的咖啡动画
    在前端开发中,使用CSS3来绘制一杯冒热气的咖啡动画是一个有趣且富有挑战性的任务。以下是一个简单的示例,说明如何使用HTML和CSS3来创建这样的动画。首先,我们需要创建HTML结构来表示咖啡杯和热气:<divclass="coffee-cup"><divclass="steam"></div><divclass="steam"></div......
  • 使用CSS3+SVG绘制沿固定路径飞行的纸飞机
    在前端开发中,要使用CSS3和SVG来创建一个沿固定路径飞行的纸飞机效果,我们可以通过几个步骤来实现。请注意,这个例子将使用SVG动画(特别是<animateMotion>元素)来沿预定路径移动纸飞机。步骤1:创建SVG元素和路径首先,在HTML文件中添加一个SVG元素,并定义一个路径,纸飞机将沿着这个路径......
  • 你有使用过ContentEditable属性吗?说说你对它的理解
    ContentEditable属性在前端开发中的理解与应用ContentEditable是HTML中的一个属性,用于指定元素内容是否可编辑。当该属性设置为"true"时,元素的内容变得可以编辑,用户可以直接在浏览器页面上修改内容。这种特性在前端开发中非常有用,尤其是在需要实现富文本编辑器或允许用户自定义页......
  • 使用CSS3绘制一只卡通小蜜蜂的动画特效
    要使用CSS3来绘制一只卡通小蜜蜂并添加动画特效,你需要利用CSS的各种属性,包括border-radius、transform、animation和@keyframes等。以下是一个简单的示例,展示了如何创建一个小蜜蜂并为其添加飞行动画。HTML<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">......
  • C语言——void指针和空指针的区别
    面试题1、void指针    (1)格式:void*    (2)void指针就是指向任何类型的指针        (3)在编译的时候不会确定其指向的类型,是在程序中进行指向的    (4)这种类型的指针不能直接进行取内容或递增递减的操作,必须先转成别的类型的指针才可以执行,否则......
  • 掌握 SQL SELECT 语句:综合指南
    SQLSELECT语句基础1.基本语法SELECT语句用于从数据库中的一个或多个表中检索数据。其基本语法如下:SELECTcolumn1,column2,...FROMtable_name;其中,column1,column2,...是你想要检索的列的名称。可以选择一个或多个列,也可以使用*来选择所有列。table_name是你要从中......