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. asp.net解决大文件断点续传

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

  2. Asp.net mvc 大文件上传 断点续传

    Asp.net mvc 大文件上传 断点续传 进度条   概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这 ...

  3. B/S大文件断点续传

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

  4. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  5. php实现大文件断点续传下载实例

    php实现大文件断点续传下载实例,看完你就知道超过100M以上的大文件如何断点传输了,这个功能还是比较经典实用的,毕竟大文件上传功能经常用得到. require_once('download.clas ...

  6. HTML5 大文件断点续传完整思路整理

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  7. Asp.net mvc 大文件上传 断点续传 进度条

    概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这篇文章,此方法确实很不错,能够稳定的上传大文件,http: ...

  8. C# Asp.NET实现上传大文件(断点续传)

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

  9. asp.net大文件断点续传

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

随机推荐

  1. Redis之RDB和AOF持久化介绍

    什么是数据库状态 redis是一个键值对的数据库服务器,服务器中通常包含中任意个非空的数据库,而每个数据库又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及他们的键值对统称为数据库状 ...

  2. docker 执行 docker system prune 导致Azure Devops build镜像失败

    运行docker的centos上, 只分配了16G的空间, 装了个mysql, 还有个rancher, 就只剩下2G的空间了, Azure Devops build镜像就出错了, 显示存储空间不足, ...

  3. 1.1 文档PUT内部原理

    文档更新原理:       PUT 一条数据的时候,如果是全量替换,ES并不会覆盖原来的文档,而是新创建一个文档,并将version+1,原文档标记为deleted,不会立刻物理删除.ES会在集群的d ...

  4. memcpy 速度测试

    1. 小米8代i5    3840X2160X4   7.77ms      即34Gbps

  5. OO——UML解析

    目录 第四单元博客作业 一.前两次作业架构设计 1. 第一次作业 2. 第二次作业 二.架构设计以及对OO方法理解的演进 1. 表达式求导 2. 多线程电梯 3. 地铁线路查询 4. UML图的解析 ...

  6. 【转载】C#中通过Distinct方法对List集合进行去重

    在C#的List集合对象中,可以使用Distinct方法来对List集合元素进行去重,如果list集合内部元素为值类型,则Distinct方法根据值类型是否相等来判断去重,如果List集合内部元素为引 ...

  7. javascript 数组排序原理的简单理解

    js内置的Array函数原型对象有个sort方法,这个方法能按照顺序排序数组. 例如: var arr1 = [6, 4, 2, 5, 2]; arr1.sort((x, y) => x - y ...

  8. Mybatis全部标签与解释说明

    一.定义SQL语句 (1)select 标签的使用 属性介绍: id :唯一的标识符. parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User或user ...

  9. python(字符串函数)

    一.字符串函数 1.首字母大小写 capitalize() title() name = "xinfangshuo" print (name.capitalize()) print ...

  10. HashMap,HashSet

    HashMap,HashSet 摘自:https://www.cnblogs.com/skywang12345/p/3310887.html#a1 目录 一.    HashMap(键值对形式存取,键 ...