c#.net实现浏览器端大文件分块上传
2021-01-09 10:30
标签:out 存在 key == 成功 pac 默认 raw upd 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 { /// /// 压缩单个文件 /// /// 被压缩的文件名称(包含文件路径) /// 压缩后的文件名称(包含文件路径) /// 压缩率0(无压缩)-9(压缩率最高) /// 缓存大小 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
{ 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); } } /// /// 获取一个文件夹下的文件 /// /// 目录名称 /// 文件列表HastTable 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; /// /// 解压文件 /// 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格式的文件。 /// /// 压缩文件路径 /// 解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹 /// 出错信息 /// 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(""); } else { //压缩文件夹 string zipPath = TextBox1.Text.Trim(); //获取将要压缩的路径(包括文件夹) string zipedPath = @"c:\temp"; //压缩文件夹的路径(包括文件夹) Zip Zc = new Zip(); Zc.ZipDir(zipPath, zipedPath, 6); this.Response.Write(""); //解压文件夹 UnZipClass unZip = new UnZipClass(); unZip.UnZip(zipedPath+ ".zip", @"c:\temp"); //要解压文件夹的路径(包括文件名)和解压路径(temp文件夹下的文件就是输入路径文件夹下的文件) this.Response.Write(""); } } } } 本方法经过测试,均已实现。 另外,附上另外一种上传文件方法,经测试已实现,参考链接: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/ 欢迎入群一起讨论:374992201 c#.net实现浏览器端大文件分块上传 标签:out 存在 key == 成功 pac 默认 raw upd 原文地址:https://www.cnblogs.com/songsu/p/13092362.html
文章标题:c#.net实现浏览器端大文件分块上传
文章链接:http://soscw.com/index.php/essay/41147.html