• C# 网络地址下载


    vs2019  .netcode3.1

    using Bps.DTO;
    using ICSharpCode.SharpZipLib.Zip;
    using Microsoft.AspNetCore.Mvc;
    using Swashbuckle.AspNetCore.Annotations;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    using Zhidian.Common.Utility;
    using Zhidian.Common.Utility.Extensions;
    using Zhidian.Common.Utility.Results;
    
    namespace Bps.ManagerAPI.Controllers
    {
        /// <summary>
        /// 网络地址下载
        /// </summary>
        [SwaggerTag("网络地址下载")]
        public class DownloadController : Controller
        {
            /// <summary>
            /// 网络地址下载
            /// </summary>
            [HttpPost("/download/zip")]
            public void DownloadZip([FromBody]DownloadInput input)
            {
                Verify.IfNull(input, "参数不能为空");
                Verify.If(input.UrlList == null || input.UrlList.Count == 0, "下载文件不能为空");
    
                //下载返回压缩文件名
                if (input.ZipName.IsNullOrEmpty())
                {
                    input.ZipName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip";
                }
                else if (!input.ZipName.ToLower().EndsWith(".zip"))
                {
                    input.ZipName += ".zip";
                }
    
                //使用WebClient 下载文件
                System.Net.WebClient myWebClient = new System.Net.WebClient();
    
                //存 文件名和数据流
                Dictionary<string, Stream> dc = new Dictionary<string, Stream>();
    
                //取出字符串中信息 (文件名和地址)
                foreach (var item in input.UrlList)
                {
                    if (item.Name.IsNullOrEmpty())
                    {
                        item.Name = Path.GetFileName(item.Url);
                    }
                    else if (!item.Name.Contains("."))
                    {
                        item.Name += Path.GetExtension(item.Url);
                    }
                    if (dc.Keys.Contains(item.Name))
                    {
                        item.Name = Guid.NewGuid().ToString("N")+ Path.GetExtension(item.Url);
                    }
    
                    //调用WebClient 的 DownLoadData 方法 下载文件
                    byte[] data = myWebClient.DownloadData(item.Url);
                    Stream stream = new MemoryStream(data);//byte[] 转换成 流
    
                    //放入 文件名 和 stream
                    dc.Add(item.Name, stream);//这里指定为 .doc格式 (自己可以随时改)
                }
    
                //调用压缩方法 进行压缩 (接收byte[] 数据)
                byte[] fileBytes = ConvertZipStream(dc);
    
                Response.ContentType = "application/octet-stream";
                Response.Headers.Add("Content-Disposition", "attachment;filename=" + input.ZipName);//文件名和格式(格式可以自己定)
                Response.Headers.Add("Content-Length", fileBytes.Length.ToString());//文件大小
                Response.Body.Write(fileBytes); //放入byte[]
                Response.Body.Close();
            }
    
    
            /// <summary>
            /// ZipStream 压缩
            /// </summary>
            /// <param name="streams">Dictionary(string, Stream) 文件名和Stream</param>
            /// <returns></returns>
            public byte[] ConvertZipStream(Dictionary<string, Stream> streams)
            {
                byte[] buffer = new byte[6500];
                MemoryStream returnStream = new MemoryStream();
                var zipMs = new MemoryStream();
                using (ZipOutputStream zipStream = new ZipOutputStream(zipMs))
                {
                    zipStream.SetLevel(9);//设置 压缩等级 (9级 500KB 压缩成了96KB)
                    foreach (var kv in streams)
                    {
                        string fileName = kv.Key;
                        using (var streamInput = kv.Value)
                        {
                            zipStream.PutNextEntry(new ZipEntry(fileName));
                            while (true)
                            {
                                var readCount = streamInput.Read(buffer, 0, buffer.Length);
                                if (readCount > 0)
                                {
                                    zipStream.Write(buffer, 0, readCount);
                                }
                                else
                                {
                                    break;
                                }
                            }
                            zipStream.Flush();
                        }
                    }
                    
                    zipStream.Finish();
                    zipMs.Position = 0;
                    zipMs.CopyTo(returnStream, zipStream.Length.ToInt());
                }
                returnStream.Position = 0;
    
                //Stream转Byte[]
                byte[] returnBytes = new byte[returnStream.Length];
                returnStream.Read(returnBytes, 0, returnBytes.Length);
                returnStream.Seek(0, SeekOrigin.Begin);
    
                return returnBytes;
            }
    
        }
    }
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Text;
    
    namespace Bps.DTO
    {
        /// <summary>
        /// 网络地址下载-输入
        /// </summary>
        public class DownloadInput
        {
            /// <summary>
            /// 下载返回压缩文件名
            /// </summary>
            public string ZipName { get; set; }
    
            /// <summary>
            /// 下载网络文件
            /// </summary>
            [Required]
            public List<DownloadUrlAndName> UrlList { get; set; }
        }
    
        public class DownloadUrlAndName {
    
            /// <summary>
            /// 网络地址
            /// </summary>
            [Required]
            public string Url { get; set; }
            /// <summary>
            /// 文件名
            /// </summary>
            public string Name { get; set; }
    
        }
    }

    参考:https://www.cnblogs.com/xxxxue/p/11153610.html

  • 相关阅读:
    VMware12中CentOS7网络设置
    技术牛人
    PHP程序员如何突破成长瓶颈(php开发三到四年)
    php多线程
    go git 安装配置与使用 (windows 7 64bit)
    php内核和瓦力上线部署
    VM虚拟机下安装Centos7.0图文教程
    php结合redis实现高并发下的抢购、秒杀功能
    php foreach循环中unset后续的键值问题
    excle导入
  • 原文地址:https://www.cnblogs.com/chxl800/p/13647274.html
Copyright © 2020-2023  润新知