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.attr('style','display:none'); form.attr('target',''); form.attr('method','post'); form.attr('action','这里写对应的方法地址'); //这里写对应的方法地址 var name1 = $(''); name1.attr('type','text'); name1.attr('name','urlStr'); name1.attr('value', urlStr); //文件url var name2 = $(''); 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# 部分

/// 
/// 下载全部条款
/// 
/// 
/// 
[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();
}

/// 
/// ZipStream 压缩
/// 
/// Dictionary(string, Stream) 文件名和Stream
/// 
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;
}

你可能感兴趣的:(C#后端)