求ASP.NET WEB项目文件夹上传下载解决方案

求ASP.NET WEB项目文件夹上传下载解决方案,第1张

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 == "") //如果输入为空,则d出提示

{

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/ 

(1)想要想上传大文件,必须在web.config文件中进行配置。

(2)在节点中添加如下代码即可:<httpRuntime maxRequestLength="2097151"/>。

(3)这个代码就是表示设置最大请求值,上传文件也就相当于请求。“maxRequestLength”单位为KB,最大值为2097151,如果不设置,默认为4096 KB (4 MB)。也就是说上传的文件最大可以上传2G以内的文件。

(4)一般没有配置的话,默认只能上传4M以内的文件。配置了的话就可以上传更大的文件。

ASP是动态服务器页面(Active Server Page)的英文缩写。 是微软公司开发的代替CGI脚本程序的一种应用,它可以与数据库和其它程序进行交互,是一种简单、方便的编程工具。ASP的网页文件的格式是 .asp。现在常用于各种动态网站中。

相信通过Asp Net的服务器控件上传文件在简单不过了 通过AjaxToolkit控件实现上传进度也不是什么难事 为什么还要自己辛辛苦苦来 实现呢?我并不否认”拿来主义“ 只是我个人更喜欢凡是求个所以然 本篇将阐述通过Html IHttpHandler和 IHttpAsyncHandler实现文件上传和上传进度的原理 希望对你有多帮助

效果图

本文涉及到的知识点 前台用到Html Ajax JQuery JQuery UI

后台用到一般处理程序(IHttpHandler)和一般异步处理程序(IHttpAsyncHandler) 并涉及到”推模式“

一 创建Html网页

在创建的Web工程中添加一个Html文件 命名为UploadFile 在头文件中引入JQuery JQuery UI

<link href="Styles/jquery ui custom css" rel="stylesheet" type=text/css /><script src=Scripts/jquery min js type=text/javascript></script><script src=Scripts/jquery ui custom min js type=text/javascript></script>

关于无刷新文件上传

通过Ajax是不能上传文件的 无刷新上传是靠隐藏的iframe来实现的

<form id="form" target = "frameFileUpload" enctype="multipart/form data"><div id="progressBar" ></div><input type=file id="fileUpload" name=fileUpload /><span id="progressValue"></span><iframe id="frameFileUpload" name=frameFileUpload ></iframe><br /><input type=submit value="上传" id = "submit"/></form>

要将form标签的target属性设置为iframe的id 当然别忘了将form的enctype设置为multipart/form data

<div id="progressBar" class="page_speeder_1512316621"></div>

是用来显示上传文件时的进度条

在JS中加入如下处理

<script type=text/javascript>$(function () { $("#submit") button()$("#fileUpload") button()})</script>

此时效果:

二 实现文件上传

添加一个一般处理程序 命名为UploadFileHandler ashx

lishixinzhi/Article/program/net/201311/14305


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11692603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存