C# 获取网络文件 批量压缩成 文件流 并下载 压缩包

需要的DLL :
ICSharpCode.SharpZipLib.dll


JS部分

	//下载所有文件的 压缩包
   function DownAllFile() {

        //zip文件名
        var zipName = "我的zip文件";
        
        //url字符串 (示例数据) (注意!: 使用 '逗号' 分隔文件名和 url 地址,使用 '$' 分隔 每个文件.)
	    var urlStr = 
	            '第1个文件,http://xxxxx/yyyyy?id=688$' +
                '第2个文件,http://xxxxx/yyyyy?id=687$' +
                '第3个文件,http://xxxxx/yyyyy?id=686$' +
                '第4个文件,http://xxxxx/yyyyy?id=685$' +
                '第5个文件,http://xxxxx/yyyyy?id=684$' +
                '第6个文件,http://xxxxx/yyyyy?id=683$' +
                '第7个文件,http://xxxxx/yyyyy?id=682$' +
                '第8个文件,http://xxxxx/yyyyy?id=681$' +
                '第9个文件,http://xxxxx/yyyyy?id=680$';
	    
        //form提交
        var form = $('<form>');    
        form.attr('style','display:none');    
        form.attr('target','');    
        form.attr('method','post');    
        form.attr('action','这里写对应的方法地址');  //这里写对应的方法地址
        
        var name1 = $('<input>');  
        name1.attr('type','text');  
        name1.attr('name','urlStr');  
        name1.attr('value', urlStr); //文件url
        
        var name2 = $('<input>');
        name2.attr('type', 'text');
        name2.attr('name', 'zipName');  
        name2.attr('value', zipName); //zip文件名
        
        $('body').append(form);  
        form.append(name1);  
        form.append(name2);  
        form.submit();    
        form.remove();  
    }


C# 部分

/// <summary>
/// 下载全部条款
/// </summary>
/// <param name="zipName"></param>
/// <param name="urlStr"></param>
[HttpPost]
public void DownAllProductClause(string zipName, string urlStr)
{
    //得到文件信息(名字,地址) (去掉最后一个 '$'  , 并用 '$' 分隔字符串. 取到每个文件的文件名和路径 )
    string[] urlArray = urlStr.TrimEnd('$').Split('$');

    //使用WebClient 下载文件
    System.Net.WebClient myWebClient = new System.Net.WebClient();

    //存 文件名 和 数据流
    Dictionary<string, Stream> dc = new Dictionary<string, Stream>();

    //取出字符串中信息 (文件名和地址)
    for (int i = 0; i < urlArray.Length; i++)
    {
        //使用 ',' 分隔 文件名和路径 [0]位置是文件名, [1] 位置是路径
        string[] urlSp = urlArray[i].Split(',');

        //调用WebClient 的 DownLoadData 方法 下载文件
        byte[] data = myWebClient.DownloadData(urlSp[1]);
        Stream stream = new MemoryStream(data);//byte[] 转换成 流

        //放入 文件名 和 stream
        dc.Add(urlSp[0] + ".doc", stream);//这里指定为 .doc格式 (自己可以随时改)
    }

    //调用压缩方法 进行压缩 (接收byte[] 数据)
    byte[] fileBytes = ConvertZipStream(dc);

    Response.ContentType = "application/octet-stream";
    Response.AppendHeader("Content-Disposition", "attachment;filename=" + zipName + ".rar");//文件名和格式(格式可以自己定)
    Response.AddHeader("Content-Length", fileBytes.Length.ToString());//文件大小
    Response.BinaryWrite(fileBytes); //放入byte[]
    Response.End();
    Response.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 (ICSharpCode.SharpZipLib.Zip.ZipOutputStream zipStream = new ICSharpCode.SharpZipLib.Zip.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 ICSharpCode.SharpZipLib.Zip.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, 5600);
    }
    returnStream.Position = 0;

    //Stream转Byte[]
    byte[] returnBytes = new byte[returnStream.Length];
    returnStream.Read(returnBytes, 0, returnBytes.Length);
    returnStream.Seek(0, SeekOrigin.Begin);

    return returnBytes;
}

转载于:https://www.cnblogs.com/xxxxue/p/11153610.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值