• C# 大文件上传解决方案(500M以上)


    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

  • 相关阅读:
    harbor无法登陆解决
    k8s中使用harbor
    harbor扩容
    harbor设置开机自启
    设置开机自启
    关Java的内存模型(JMM)
    多线程相关概念
    多线程(JDK1.5的新特性互斥锁)
    synchronized关键字
    【异常】redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'PSETEX'
  • 原文地址:https://www.cnblogs.com/songsu/p/12795404.html
Copyright © 2020-2023  润新知