.NET大文件上传解决方案

ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现。

下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压。

ASP.NET页面设计:TextBox和Button按钮。

TextBox中需要自己受到输入文件夹的路径(包含文件夹),通过Button实现选择文件夹的问题还没有解决,暂时只能手动输入。

两种方法:生成rar和zip。

1.生成rar

using Microsoft.Win32;

using System.Diagnostics;

protected void Button1Click(object sender, EventArgs e)

 {

 RAR(@"E:\95413594531\GIS", "tmptest", @"E:\95413594531\");

 }

 ///

 /// 压缩文件

 ///

 /// 需要压缩的文件夹或者单个文件

 /// 生成压缩文件的文件名

 /// 生成压缩文件保存路径

 ///

 protected bool RAR(string DFilePath, string DRARName,string DRARPath)

 {

 String therar;

 RegistryKey theReg;

 Object theObj;

 String theInfo;

 ProcessStartInfo theStartInfo;

 Process theProcess;

 try

 {

 theReg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\Shell\Open\Command"); //注:未在注册表的根路径找到此路径

 theObj = theReg.GetValue("");

 therar = theObj.ToString();

 theReg.Close();

 therar = therar.Substring(1, therar.Length - 7);

 theInfo = " a " + " " + DRARName + " " + DFilePath +" -ep1"; //命令 + 压缩后文件名 + 被压缩的文件或者路径

 theStartInfo = new ProcessStartInfo();

 theStartInfo.FileName = therar;

 theStartInfo.Arguments = theInfo;

 theStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

 theStartInfo.WorkingDirectory = DRARPath ; //RaR文件的存放目录。

 theProcess = new Process();

 theProcess.StartInfo = theStartInfo;

 theProcess.Start();

 theProcess.WaitForExit();

 theProcess.Close();

 return true;

 }

 catch (Exception ex)

 {

 return false;

 }

 }


 ///

 /// 解压缩到指定文件夹

 ///

 /// 压缩文件存在的目录

 /// 压缩文件名称

 /// 解压到文件夹

 ///

 protected bool UnRAR(string RARFilePath,string RARFileName,string UnRARFilePath)

 {

 //解压缩

 String therar;

 RegistryKey theReg;

 Object theObj;

 String theInfo;

 ProcessStartInfo theStartInfo;

 Process theProcess;

 try

 {

 theReg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRar.exe\Shell\Open\Command");

 theObj = theReg.GetValue("");

 therar = theObj.ToString();

 theReg.Close();

 therar = therar.Substring(1, therar.Length - 7);

 theInfo = @" X " + " " + RARFilePath + RARFileName + " " + UnRARFilePath;

 theStartInfo = new ProcessStartInfo();

 theStartInfo.FileName = therar;

 theStartInfo.Arguments = theInfo;

 theStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

 theProcess = new Process();

     theProcess.StartInfo = theStartInfo;

 theProcess.Start();

 return true;

 }

 catch (Exception ex)

 {

 return false;

 }

 }

注:这种方法在在电脑注册表中未找到应有的路径,未实现,仅供参考。

2.生成zip

通过调用类库ICSharpCode.SharpZipLib.dll

该类库可以从网上下载。也可以从本链接下载:SharpZipLib_0860_Bin.zip

增加两个类:Zip.cs和UnZip.cs

(1)Zip.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;


using System.IO;

using System.Collections;

using ICSharpCode.SharpZipLib.Checksums;

using ICSharpCode.SharpZipLib.Zip;



namespace UpLoad

{

 ///

 /// 功能:压缩文件

 /// creator chaodongwang 2009-11-11

 ///

 public class Zip

 {

 ///

 /// 压缩单个文件

 ///

 /// 被压缩的文件名称(包含文件路径)</param>

 /// 压缩后的文件名称(包含文件路径)</param>

 /// 压缩率0(无压缩)-9(压缩率最高)</param>

 /// 缓存大小</param>

 public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel)

 {

 //如果文件没有找到,则报错

 if (!System.IO.File.Exists(FileToZip))

        {

 throw new System.IO.FileNotFoundException("文件:" + FileToZip + "没有找到!");

 }


 if (ZipedFile == string.Empty)

 {

 ZipedFile = Path.GetFileNameWithoutExtension(FileToZip) + ".zip";

 }


 if (Path.GetExtension(ZipedFile) != ".zip")

 {

 ZipedFile = ZipedFile + ".zip";

 }


 ////如果指定位置目录不存在,创建该目录

 //string zipedDir = ZipedFile.Substring(0,ZipedFile.LastIndexOf("\\"));

 //if (!Directory.Exists(zipedDir))

 // Directory.CreateDirectory(zipedDir);


 //被压缩文件名称

 string filename = FileToZip.Substring(FileToZip.LastIndexOf('\\') + 1);


 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(filename);

 ZipStream.PutNextEntry(ZipEntry);

 ZipStream.SetLevel(CompressionLevel);

 byte[] buffer = new byte[2048];

 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;

 }

 finally

 {

 ZipStream.Finish();

 ZipStream.Close();

 StreamToZip.Close();

 }

 }


 ///

 /// 压缩文件夹的方法

 ///

 public void ZipDir(string DirToZip, string ZipedFile, int CompressionLevel)

 {

 //压缩文件为空时默认与压缩文件夹同一级目录

 if (ZipedFile == string.Empty)

 {

 ZipedFile = DirToZip.Substring(DirToZip.LastIndexOf("\\") + 1);

 ZipedFile = DirToZip.Substring(0, DirToZip.LastIndexOf("\\")) +"\\"+ ZipedFile+".zip";

 }


 if (Path.GetExtension(ZipedFile) != ".zip")

 {

 ZipedFile = ZipedFile + ".zip";

 }


        using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(ZipedFile)))

 {

 zipoutputstream.SetLevel(CompressionLevel);

 Crc32 crc = new Crc32();

 Hashtable fileList = getAllFies(DirToZip);

 foreach (DictionaryEntry item in fileList)

 {

 FileStream fs = File.OpenRead(item.Key.ToString());

 byte[] buffer = new byte[fs.Length];

 fs.Read(buffer, 0, buffer.Length);

 ZipEntry entry = new ZipEntry(item.Key.ToString().Substring(DirToZip.Length + 1));

 entry.DateTime = (DateTime)item.Value;

 entry.Size = fs.Length;

 fs.Close();

                   crc.Reset();

 crc.Update(buffer);

 entry.Crc = crc.Value;

 zipoutputstream.PutNextEntry(entry);

 zipoutputstream.Write(buffer, 0, buffer.Length);

 }

 }

 }


 ///

 /// 获取所有文件

 ///

 ///

 private Hashtable getAllFies(string dir)

 {

 Hashtable FilesList = new Hashtable();

 DirectoryInfo fileDire = new DirectoryInfo(dir);

 if (!fileDire.Exists)

 {

 throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");

 }


 this.getAllDirFiles(fileDire, FilesList);

 this.getAllDirsFiles(fileDire.GetDirectories(), FilesList);

 return FilesList;

 }

 ///

 /// 获取一个文件夹下的所有文件夹里的文件

 ///

 ///

 ///

 private void getAllDirsFiles(DirectoryInfo[] dirs, Hashtable filesList)

 {

 foreach (DirectoryInfo dir in dirs)

 {

 foreach (FileInfo file in dir.GetFiles("*.*"))

 {

 filesList.Add(file.FullName, file.LastWriteTime);

 }

 this.getAllDirsFiles(dir.GetDirectories(), filesList);

 }

 }

 ///

 /// 获取一个文件夹下的文件

 ///

 /// 目录名称</param>

 /// 文件列表HastTable</param>

 private void getAllDirFiles(DirectoryInfo dir, Hashtable filesList)

 {

 foreach (FileInfo file in dir.GetFiles("*.*"))

 {

 filesList.Add(file.FullName, file.LastWriteTime);

 }

 }

 }

}

(2)UnZip.cs

using System.Collections.Generic;

using System.Linq;

using System.Web;


/// <summary>

/// 解压文件

/// </summary>


using System;

using System.Text;

using System.Collections;

using System.IO;

using System.Diagnostics;

using System.Runtime.Serialization.Formatters.Binary;

using System.Data;


using ICSharpCode.SharpZipLib.Zip;

using ICSharpCode.SharpZipLib.Zip.Compression;

using ICSharpCode.SharpZipLib.Zip.Compression.Streams;


namespace UpLoad

{

 ///

 /// 功能:解压文件

 /// creator chaodongwang 2009-11-11

 ///

 public class UnZipClass

 {

 ///

 /// 功能:解压zip格式的文件。

    ///

 /// 压缩文件路径</param>

 /// 解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>

 /// 出错信息</param>

 /// 解压是否成功</returns>

 public void UnZip(string zipFilePath, string unZipDir)

 {

 if (zipFilePath == string.Empty)

 {

 throw new Exception("压缩文件不能为空!");

 }

 if (!File.Exists(zipFilePath))

 {

 throw new System.IO.FileNotFoundException("压缩文件不存在!");

 }

 //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹

 if (unZipDir == string.Empty)

 unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));

 if (!unZipDir.EndsWith("\\"))

 unZipDir += "\\";

 if (!Directory.Exists(unZipDir))

 Directory.CreateDirectory(unZipDir);


 using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))

 {


 ZipEntry theEntry;

 while ((theEntry = s.GetNextEntry()) != null)

 {

 string directoryName = Path.GetDirectoryName(theEntry.Name);

 string fileName = Path.GetFileName(theEntry.Name);

 if (directoryName.Length > 0)

 {

 Directory.CreateDirectory(unZipDir + directoryName);

 }

            if (!directoryName.EndsWith("\\"))

 directoryName += "\\";

 if (fileName != String.Empty)

 {

 using (FileStream streamWriter = File.Create(unZipDir + 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;

 }

 }

 }

        }

 }

 }

 }

 }

}

以上这两个类库可以直接在程序里新建类库,然后复制粘贴,直接调用即可。

主程序代码如下所示:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Drawing;


using Microsoft.Win32;

using System.Diagnostics;



namespace UpLoad

{

 public partial class UpLoadForm : System.Web.UI.Page

 {

 protected void Page_Load(object sender, EventArgs e)

 {


 }


 protected void Button1_Click(object sender, EventArgs e)

 {

 if (TextBox1.Text == "") //如果输入为空,则弹出提示

 {

 this.Response.Write("alert('输入为空,请重新输入!');window.opener.location.href=window.opener.location.href;</script>");

 }

 else

 {

 //压缩文件夹

 string zipPath = TextBox1.Text.Trim(); //获取将要压缩的路径(包括文件夹)

 string zipedPath = @"c:\temp"; //压缩文件夹的路径(包括文件夹)

 Zip Zc = new Zip();

 Zc.ZipDir(zipPath, zipedPath, 6);

 this.Response.Write("alert('压缩成功!');window.opener.location.href=window.opener.location.href;</script>");


 //解压文件夹

 UnZipClass unZip = new UnZipClass();

 unZip.UnZip(zipedPath+ ".zip", @"c:\temp"); //要解压文件夹的路径(包括文件名)和解压路径(temp文件夹下的文件就是输入路径文件夹下的文件)

 this.Response.Write("alert('解压成功!');window.opener.location.href=window.opener.location.href;</script>");


 }

 }

 }

}

本方法经过测试,均已实现。

另外一种方法,就是直接使用插件,详细信息或源码可以直接网上搜索“up6”

欢迎入群一起讨论:374992201

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容