天天看點

.net大檔案上傳

.net大檔案上傳

ASP.NET上傳檔案用FileUpLoad就可以,但是對檔案夾的操作卻不能用FileUpLoad來實作。

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)

        //解壓縮

         {

            theReg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRar.exe\Shell\Open\Command");

            theInfo = @" X " + " " + RARFilePath + RARFileName + " " + UnRARFilePath;

             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();

        /// 壓縮檔案夾的方法

        public void ZipDir(string DirToZip, string ZipedFile, int CompressionLevel)

            //壓縮檔案為空時預設與壓縮檔案夾同一級目錄

                ZipedFile = DirToZip.Substring(DirToZip.LastIndexOf("\\") + 1);

                ZipedFile = DirToZip.Substring(0, DirToZip.LastIndexOf("\\")) +"\\"+ 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);

        /// 擷取所有檔案

        /// <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;

        /// 擷取一個檔案夾下的所有檔案夾裡的檔案

        /// <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);

        /// 擷取一個檔案夾下的檔案

        /// <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);

}

壓縮檔案不能為空!");

            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.Web.UI;

using System.Web.UI.WebControls;

using System.Drawing;

    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>");

本方法經過測試,均已實作。

繼續閱讀