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

{

/// <summary>

/// 功能:压缩文件

/// creator chaodongwang 2009-11-11

/// </summary>

public class Zip

{

/// <summary>

/// 压缩单个文件

/// </summary>

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

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

/// <param name="CompressionLevel">压缩率0(无压缩)-9(压缩率最高)</param>

/// <param name="BlockSize">缓存大小</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();

}

}

/// <summary>

/// 压缩文件夹的方法

/// </summary>

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

}

}

}

/// <summary>

/// 获取所有文件

/// </summary>

/// <returns></returns>

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;

}

/// <summary>

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

/// </summary>

/// <param name="dirs"></param>

/// <param name="filesList"></param>

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

}

}

/// <summary>

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

/// </summary>

/// <param name="strDirName">目录名称</param>

/// <param name="filesList">文件列表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

{

/// <summary>

/// 功能:解压文件

/// creator chaodongwang 2009-11-11

/// </summary>

public class UnZipClass

{

/// <summary>

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

/// </summary>

/// <param name="zipFilePath">压缩文件路径</param>

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

/// <param name="err">出错信息</param>

/// <returns>解压是否成功</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("<script>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("<script>alert('压缩成功!');window.opener.location.href=window.opener.location.href;</script>");

//解压文件夹

UnZipClass unZip = new UnZipClass();

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

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

}

}

}

}

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

另外,附上另外一种上传文件方法,经测试已实现,参考链接:http://blog.ncmem.com/wordpress/2019/11/20/net%e4%b8%8a%e4%bc%a0%e5%a4%a7%e6%96%87%e4%bb%b6%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/

asp.net文件夹上传源码的更多相关文章

  1. php文件夹上传源码

    1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...

  2. vue文件夹上传源码

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...

  3. .net文件夹上传源码

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  4. html5文件夹上传源码

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  5. web文件夹上传源码

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  6. 挑战--asp.net 文件夹上传

    今天遇到一个有趣的问题,公司让平安做一个上传文件夹的功能,这个任务具有一定的挑战性哦.上传文件夹,我第一次看到有人这样做,以前都是上传压缩文件,从来就没有见人上传过文件夹,我也从来就没有尝试过.先不讨 ...

  7. asp.net文件夹上传下载组件

    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...

  8. asp.net文件夹上传下载控件分享

    用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个需要在.net环境下大文件上传的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助. 以下是此例中各种脚本文件 ...

  9. 深入springMVC源码------文件上传源码解析(下篇)

    在上篇<深入springMVC------文件上传源码解析(上篇) >中,介绍了springmvc文件上传相关.那么本篇呢,将进一步介绍springmvc 上传文件的效率问题. 相信大部分 ...

随机推荐

  1. 【Linux】一步一步学Linux——Linux发展史(01)

    目录 00. 目录 01. Linux概述 02. Linux简史 03. Linux主要特性 04. Linux之父 05. Linux相关术语 06. Linux其它 07. Linux应用领域 ...

  2. docker 宿主机与容器直接文件移动命令

    1.将容器中的文件复制到宿主机 我们把容器中的 nginx 目录整个复制到  宿主机/usr/local/nginx 目录下,使用如下命令: docker cp nginx_test: /etc/ng ...

  3. Spring Boot学习随记

    由于早年在管理领域耕耘了一段时间,完美错过了Spring的活跃期, 多少对这个经典的技术带有一种遗憾的心态在里面的, 从下面的我的生涯手绘图中大概可以看出来我的经历. 最近由于新介入到了工业数字化领域 ...

  4. OSS服务和自建服务器存储对比

    1 OSS 1.1 什么是OSS   阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.它是一个分布式的对象存储服务 ...

  5. .net SHA-256 SHA-1

    Framework 4.5 uses SHA-256 algorithm for the signature, and 4.0 uses SHA-1.

  6. [技术翻译]您应该知道的13个有用的JavaScript数组技巧

    本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...

  7. Ubuntu安装opencv3.4.4教程

    1 去官网下载opencv 在本教程中选用的是opencv3.4.4,下载链接 http://opencv.org/releases.html ,选择sources. 2 解压 unzip openc ...

  8. H5新增input标签

    1.电子邮件 <input type="email" name="email"/> 默认正则:输入内容必须有@符号,@后面必须有内容 2.搜索框 & ...

  9. (详细)Eclips+jsp+servlet+mysql+登录实例+源代码

    欢迎任何形式的转载,但请务必注明出处. 该教程较全,从软件的安装以及相关的环境配置我都放置了相关教程的链接,读者可直接点击进入.自己写电商网站作业时查找了很多资料,但都不是很全,所以趁着寒假写了这份教 ...

  10. Java 之 ObjectInputStream 类

    ObjectInputStream 类 1.概述 java.io.ObjectInputStream extends InputStream ObjectInputStream 反序列化流,将之前使用 ...