实现asp.net的文件压缩、解压、下载
很早前就想做文件的解压、压缩、下载 了,不过一直没时间,现在项目做完了,今天弄了下。不过解压,压缩的方法还是看的网上的,嘻嘻~~不过我把它们综合了一下哦。呵呵~~
1.先要从网上下载一个icsharpcode.sharpziplib.dll
2.建立类AttachmentUnZip,内容如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using System.IO;
/// <summary>
///AttachmentUnZip 的摘要说明
/// </summary>
public class AttachmentUnZip
{
public AttachmentUnZip()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public static void UpZip(string zipFile)
{
string[] FileProperties = new string[2];
FileProperties[0] = zipFile;//待解压的文件
FileProperties[1] = zipFile.Substring(0, zipFile.LastIndexOf("//") + 1);//解压后放置的目标目录
UnZipClass UnZc = new UnZipClass();
UnZc.UnZip(FileProperties);
}
}
3.建立类UnZipClass,内容如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
/// <summary>
///UnZipClass 的摘要说明
/// </summary>
public class UnZipClass
{
public UnZipClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 解压文件
/// </summary>
/// <param name="args">包含要解压的文件名和要解压到的目录名数组</param>
public void UnZip(string[] args)
{
ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
try
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(args[1]);
string fileName = Path.GetFileName(theEntry.Name);
//生成解压目录
Directory.CreateDirectory(directoryName);
if (fileName != String.Empty)
{
//解压文件到指定的目录
FileStream streamWriter = File.Create(args[1] + fileName);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
s.Close();
}
catch (Exception eu)
{
throw eu;
}
finally
{
s.Close();
}
}//end UnZip
public static bool UnZipFile(string file, string dir)
{
try
{
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
string fileFullName = Path.Combine(dir, file);
ZipInputStream s = new ZipInputStream(File.OpenRead(fileFullName));
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
if (directoryName != String.Empty)
Directory.CreateDirectory(Path.Combine(dir, directoryName));
if (fileName != String.Empty)
{
FileStream streamWriter = File.Create(Path.Combine(dir, theEntry.Name));
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
s.Close();
return true;
}
catch (Exception)
{
throw;
}
}
}
4.建立类ZipClass,内容如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
/// <summary>
///ZipClass 的摘要说明
/// </summary>
public class ZipClass
{
public ZipClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel, int BlockSize, string password)
{
//如果文件没有找到,则报错
if (!System.IO.File.Exists(FileToZip))
{
throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
}
System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
ZipEntry ZipEntry = new ZipEntry("ZippedFile");
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(CompressionLevel);
byte[] buffer = new byte[BlockSize];
System.Int32 size = StreamToZip.Read(buffer, 0, buffer.Length);
ZipStream.Write(buffer, 0, size);
try
{
while (size < StreamToZip.Length)
{
int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
ZipStream.Write(buffer, 0, sizeRead);
size += sizeRead;
}
}
catch (System.Exception ex)
{
throw ex;
}
ZipStream.Finish();
ZipStream.Close();
StreamToZip.Close();
}
public void ZipFileMain(string[] args)
{
//string[] filenames = Directory.GetFiles(args[0]);
string[] filenames = new string[] { args[0] };
Crc32 crc = new Crc32();
ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));
s.SetLevel(6); // 0 - store only to 9 - means best compression
foreach (string file in filenames)
{
//打开压缩文件
FileStream fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(file);
entry.DateTime = DateTime.Now;
// set Size and the crc, because the information
// about the size and crc should be stored in the header
// if it is not set it is automatically written in the footer.
// (in this case size == crc == -1 in the header)
// Some ZIP programs have problems with zip files that don't store
// the size and crc in the header.
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
s.Finish();
s.Close();
}
}
5.类建好了,接下来建立测试页了。呵呵~~EcodeZipRar.aspx,哦,对了,忘了说了,我还在网站外层目录下建了一个文件夹FileZip,用来存放文件的。
前台页面显示:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="EcodeZipRar.aspx.cs" Inherits="EcodeZipRar" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
添加要压缩的文件:<asp:fileupload ID="Fileupload1" runat="server"></asp:fileupload>
<br />
<asp:Button ID="Button1" runat="server" Text="上传文件" onclick="Button1_Click" />//对于Fileupload1操作的
<asp:Button ID="Button2" runat="server" onclick="Button2_Click1" Text="开始解压" />//对于Fileupload1操作的
<asp:Button ID="Button3" runat="server" Text="文件下载" onclick="Button3_Click" /><br />//对于TreeView1操作的
<asp:TreeView ID="TreeView1" runat="server" ShowCheckBoxes="All">//显示文件夹下的所有文件
</asp:TreeView>
</div>
</form>
</body>
</html>
后台代码操作:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.Diagnostics;
public partial class EcodeZipRar : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
List();
}
//实现文件压缩
protected void Button1_Click(object sender, EventArgs e)
{
string[] FileProperties = new string[2];
string fullName = Fileupload1.PostedFile.FileName;//C:/test/a.txt
//待压缩文件
FileProperties[0] = fullName;
string format = Path.GetExtension(fullName);//文件格式
string[] type = { ".zip", ".rar" };
bool isZip = true;//指定文件是否需要压缩
foreach (string types in type)
{
if (format == types)
{
isZip = false;
break;
}
}
string newPath = HttpContext.Current.Server.MapPath("~/FileZip/") + Fileupload1.FileName;
try
{
Fileupload1.SaveAs(newPath);
if (isZip)
{
FileProperties[1] = HttpContext.Current.Server.MapPath("~/FileZip/") + System.IO.Path.GetFileNameWithoutExtension(fullName) + ".zip";
//如果文件已经存在,则删除原来的文件
if(File.Exists(FileProperties[1]))
{
File.Delete(FileProperties[1]);
}
//压缩后的目标文件
ZipClass Zc = new ZipClass();
Zc.ZipFileMain(FileProperties);
File.Delete(HttpContext.Current.Server.MapPath("~/FileZip/") + Fileupload1.FileName);//删除原始文件
}
List();
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert('文件上传成功!')</script>");
}
catch
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert('文件上传失败!')</script>");
}
}
//文件解压
protected void Button2_Click1(object sender, EventArgs e)
{
string fullName = Fileupload1.PostedFile.FileName; ;//C:/test/a.zip
string format = Path.GetExtension(fullName);//文件格式
string[] type = { ".zip"};
bool isUnZip =false;//指定文件是否需要解压
foreach (string types in type)
{
if (format == types)
{
isUnZip = true;
break;
}
}
if (isUnZip)
{
//解压文件
AttachmentUnZip.UpZip(fullName);
string[] FileProperties = new string[2];
FileProperties[0] = fullName;//待解压的文件
FileProperties[1] = System.IO.Path.GetDirectoryName(fullName);//解压后放置的目标目录
UnZipClass UnZc = new UnZipClass();
try
{
UnZc.UnZip(FileProperties);
List();
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert('文件解压成功!')</script>");
}
catch
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert('文件解压失败!')</script>");
}
}
else
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert('解压文件格式为zip!')</script>");
}
}
//获取指定目录下的所有文件
protected void List()
{
TreeView1.Nodes.Clear();
string[] files = Directory.GetFiles(HttpContext.Current.Server.MapPath("~/FileZip/"));
foreach (string file in files)
{
TreeNode node = new TreeNode();
node.Text = file;
TreeView1.Nodes.Add(node);
}
}
//文件下载
protected void Button3_Click(object sender, EventArgs e)
{
foreach (TreeNode node in TreeView1.Nodes)
{
if (node.Checked)
{
string path = node.Text;
string fileName = Path.GetFileName(path);
DownLoad(fileName, path);
}
}
}
/*
微软为Response对象提供了一个新的方法TransmitFile来解决使用 Response.BinaryWrite下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
代码如下:
*/
/// <summary>
///
/// </summary>
/// <param name="fileName">所下载的文件名</param>
/// <param name="path">所下载的文件路径</param>
protected void DownLoad(string fileName, string path)
{
try
{
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName + "");
string file = Server.MapPath(path);
Response.TransmitFile(file);
}
catch
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert('文件下载失败!')</script>");
}
}
}
呵呵,就这样了,暂时没用多线程的,不知道很多人同时下载或上传会不会有影响呢?多线程可以解决问题吗?暂时还没弄,有时间我再看下,然后与大家分享。呵呵~~
不好意思,忘说了,在FireFox浏览器下Fileupload1.PostedFile.FileName获得的只是文件名,因为安全问题完整路径被屏蔽了,在ie下获得的是完整路径,如果发现不是,可以在工具中的Internet选项中设置的。在firefox下就郁闷了,暂时没发现可以设置的。
实现asp.net的文件压缩、解压、下载的更多相关文章
- Linux 之 文件压缩解压
文件压缩解压 参考教程:[千峰教育] 命令: gzip: 作用:压缩文件,只能是单个文件,不能是多个,也不能是目录. 格式:gzip file 说明:执行命令会生成file.gz,删除原来的file ...
- linux驱动系列之文件压缩解压小节(转)
转至网页:http://www.jb51.net/LINUXjishu/43356.html Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通 ...
- 分享一个ASP.NET 文件压缩解压类 C#
需要引用一个ICSharpCode.SharpZipLib.dll using System; using System.Collections.Generic; using System.Linq; ...
- iOS - File Archive/UnArchive 文件压缩/解压
1.ZipArchive 方式 ZipArchive 只能对 zip 类文件进行压缩和解压缩 GitHub 网址:https://github.com/ZipArchive/ZipArchive Zi ...
- linux文件压缩解压命令
01-.tar格式解包:[*******]$ tar xvf FileName.tar打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是压缩! ...
- Linux基础------文件打包解包---tar命令,文件压缩解压---命令gzip,vim编辑器创建和编辑正文件,磁盘分区/格式化,软/硬链接
作业一:1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cat /etc/passwd /etc/group > /1.txt2) 将用户信息数据库文件和用户 ...
- linux笔记:linux常用命令-压缩解压命令
压缩解压命令:gzip(压缩文件,不保留原文件.这个命令不能压缩目录) 压缩解压命令:gunzip(解压.gz的压缩文件) 压缩解压命令:tar(打包压缩目录或者解压压缩文件.打包的意思是把目录打包成 ...
- Ionic.Zip.dll文件压缩和解压
Ionic.Zip.dll文件压缩和解压 下载地址: http://download.csdn.net/detail/yfz19890410/5578515 1.下载Ionic.Zip.dll组件,添 ...
- linux命令:压缩解压命令
压缩解压命令:gzip 命令名称:gzip 命令英文原意:GNU zip 命令所在路径:/bin/gzip 执行权限:所有用户 语法:gzip 选项 [文件] 功能描述:压缩文件 压缩后文件格式:g ...
- 基于哈夫曼编码的压缩解压程序(C 语言)
这个程序是研一上学期的课程大作业.当时,跨专业的我只有一点 C 语言和数据结构基础,为此,我查阅了不少资料,再加上自己的思考和分析,实现后不断调试.测试和完善,耗时一周左右,在 2012/11/19 ...
随机推荐
- 『编程题全队』Alpha 阶段冲刺博客Day1
『编程题全队』Alpha 阶段冲刺博客Day1 一.Alpha 阶段全组总任务 二.各个成员在 Alpha 阶段认领的任务 三.明日各个成员的任务安排 孙志威:实现基本的网络连接, 完成燃尽图模块 孙 ...
- Putty+Xming实现在Windows客户端显示Linux服务器端的图形化程序
走了不少弯路啊~~~言归正传,最近研发和我说要在一台EC2的机器上运行一个带GUI的程序,当时我就纳闷了:EC2的机器应该没有桌面套件的吧,那该怎么运行GUI的程序呢?百思不得其解时收到一封邮件,大致 ...
- 2018 南京icpc现场赛总结
Day 0 提前5个小时从学校出发,在登机口坐下时,飞机还有1个多小时起飞. 航班准时起飞,到了南京以后直接坐地铁到学校附近(南京地铁票也太精致了吧). 因为天已经黑了,就只在学校附近转了一圈就回酒店 ...
- jmeter发送json数据,报405、400错误解决方案
1.405错误解决方案:添加HTTP信息头管理器(错误因数:发送格式未设置) 2.400错误解决方案:json文本格式有误(注意:换行.空格等)解决方案:对照json文本数据(错误因数:发送的json ...
- DAY7-Python学习笔记
前记: 这几天在弄小程序,view页面的开发很简单,但是在加载图片上遇到了问题,小程序的大小不能超过2M,所以大部分的图片内容要通过request请求服务器来获取,这里之前学习小程序的时候是通过网站A ...
- 知乎回答:每日完成任务用于打卡的APP
其实我也一直在寻找最佳的解决方案.安卓上有这样的,叫做HabitHub.用过一段时间,不容易坚持,这个软件对于培养习惯来说无疑是最好的,但是仅限于记录,这样的软件实在太多.我这里提供一下我自己的方法, ...
- Latex编译过程中遇到的奇奇怪怪的问题及解决方案
标签(空格分隔): 杂七杂八的问题 有必要写一个博文记录自己在Latex编译时遇到的各种问题,希望可以帮到遇到同样错误的亲故.讲真,一直没有系统的学习Latex,都是投哪个会直接拿那个会的模板来套,然 ...
- Trailing Zeroes (II) LightOJ - 1090(预处理+前缀和)
求C(n,r)*p^q的后缀零 考虑一下 是不是就是求 10^k*m 的k的最大值 而10又是由2 和 5 组成 所以即是求 2^k1 * 5^k2 * m1 中k1和k2小的那一个数 短板效应嘛 ...
- 关于UIInterfaceOrientation的一个bug
在ios中获取设备当前方向的枚举有UIInterfaceOrientation和UIDeviceOrientation ,前者包含枚举 Unknown//未知 Portrait//屏幕竖直,home键 ...
- 【Cf #299 C】Tavas and Pashmaks(单调栈,凸性)
一个经典的二维数点模型,如果某个人 $ x $ 两个速度都比另一个人 $ y $ 大,显然 $y$ 是不可能成为winner的. 但这里只考虑两个人$x$,$y$在两个属性各有千秋的时候,一定存在正整 ...