• c#.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:95413594531GIS", "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(@"ApplicationsWinRAR.exeShellOpenCommand"); //注:未在注册表的根路径找到此路径

                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(@"ApplicationsWinRar.exeShellOpenCommand");

                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: emp"; //压缩文件夹的路径(包括文件夹)

                    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: emp"); //要解压文件夹的路径(包括文件名)和解压路径(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/ 

    欢迎入群一起讨论:374992201

  • 相关阅读:
    poj 2584 T-Shirt Gumbo (二分匹配)
    hdu 1757 A Simple Math Problem (乘法矩阵)
    矩阵之矩阵乘法(转载)
    poj 2239 Selecting Courses (二分匹配)
    hdu 3661 Assignments (贪心)
    hdu 1348 Wall (凸包)
    poj 2060 Taxi Cab Scheme (二分匹配)
    hdu 2202 最大三角形 (凸包)
    hdu 1577 WisKey的眼神 (数学几何)
    poj 1719 Shooting Contest (二分匹配)
  • 原文地址:https://www.cnblogs.com/songsu/p/13092362.html
Copyright © 2020-2023  润新知