asp.net 点击“下载”弹出“下载文件”对话框,网页与要下载的文件不在同一服务器上,如何写?

asp.net 点击“下载”弹出“下载文件”对话框,网页与要下载的文件不在同一服务器上,如何写?,第1张

嗯,这个其实就是一个超链接连过去就行了。要知道远程文件的url就可以。

比如说:<a href="http://wwwrarlabcom/rar/wrar393exe">下载</a>

或是用js打开远程文件的url。

一般来说迅雷都能够捕捉到的,但并不能100%确保(谁都不能确保)

缺点:远程文件如果设置了防盗链,就没用了

如果你说的“远程服务器”是内网的,那没办法做到的

if (context == null)

{

throw new ArgumentNullException("context");

}

HttpResponseBase response = contextHttpContextResponse;

responseContentType = thisContentType;

if (!stringIsNullOrEmpty(thisFileDownloadName))

{

string headerValue = ContentDispositionUtilGetHeaderValue(thisFileDownloadName);

contextHttpContextResponseAddHeader("Content-Disposition", headerValue);

}

ASPNET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现。

下面这个示例便是使用ASPNET来实现上传文件夹并对文件夹进行压缩以及解压。

ASPNET页面设计:TextBox和Button按钮。

TextBox中需要自己受到输入文件夹的路径(包含文件夹),通过Button实现选择文件夹的问题还没有解决,暂时只能手动输入。

两种方法:生成rar和zip。

1生成rar

using MicrosoftWin32;

using SystemDiagnostics;

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 = RegistryClassesRootOpenSubKey(@"Applications\WinRARexe\Shell\Open\Command"); //注:未在注册表的根路径找到此路径

            theObj = theRegGetValue("");

            therar = theObjToString();

            theRegClose();

            therar = therarSubstring(1, therarLength - 7);

            theInfo = " a    " + " " + DRARName + "  " + DFilePath +" -ep1"; //命令 + 压缩后文件名 + 被压缩的文件或者路径

            theStartInfo = new ProcessStartInfo();

            theStartInfoFileName = therar;

            theStartInfoArguments = theInfo;

            theStartInfoWindowStyle = ProcessWindowStyleHidden;

            theStartInfoWorkingDirectory = DRARPath ; //RaR文件的存放目录。

            theProcess = new Process();

            theProcessStartInfo = theStartInfo;

            theProcessStart();

            theProcessWaitForExit();

            theProcessClose();

            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 = RegistryClassesRootOpenSubKey(@"Applications\WinRarexe\Shell\Open\Command");

            theObj = theRegGetValue("");

            therar = theObjToString();

            theRegClose();

            therar = therarSubstring(1, therarLength - 7);

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

            theStartInfo = new ProcessStartInfo();

            theStartInfoFileName = therar;

            theStartInfoArguments = theInfo;

            theStartInfoWindowStyle = ProcessWindowStyleHidden;

            theProcess = new Process();

            theProcessStartInfo = theStartInfo;

            theProcessStart();

            return true;

        }

        catch (Exception ex)

         {

             return false;

         }

    }

注:这种方法在在电脑注册表中未找到应有的路径,未实现,仅供参考。

2生成zip

通过调用类库ICSharpCodeSharpZipLibdll

该类库可以从网上下载。也可以从本链接下载:SharpZipLib_0860_Binzip

增加两个类:Zipcs和UnZipcs

(1)Zipcs

using System;

using SystemCollectionsGeneric;

using SystemLinq;

using SystemWeb;

 

using SystemIO;

using SystemCollections;

using ICSharpCodeSharpZipLibChecksums;

using ICSharpCodeSharpZipLibZip;

 

 

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 (!SystemIOFileExists(FileToZip))

            {

                throw new SystemIOFileNotFoundException("文件:" + FileToZip + "没有找到!");

            }

 

            if (ZipedFile == stringEmpty)

            {

                ZipedFile = PathGetFileNameWithoutExtension(FileToZip) + "zip";

            }

 

            if (PathGetExtension(ZipedFile) != "zip")

            {

                ZipedFile = ZipedFile + "zip";

            }

 

            ////如果指定位置目录不存在,创建该目录

            //string zipedDir = ZipedFileSubstring(0,ZipedFileLastIndexOf("\\"));

            //if (!DirectoryExists(zipedDir))

            //    DirectoryCreateDirectory(zipedDir);

 

            //被压缩文件名称

            string filename = FileToZipSubstring(FileToZipLastIndexOf('\\') + 1);

           

            SystemIOFileStream StreamToZip = new SystemIOFileStream(FileToZip, SystemIOFileModeOpen, SystemIOFileAccessRead);

            SystemIOFileStream ZipFile = SystemIOFileCreate(ZipedFile);

            ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);

            ZipEntry ZipEntry = new ZipEntry(filename);

            ZipStreamPutNextEntry(ZipEntry);

            ZipStreamSetLevel(CompressionLevel);

            byte[] buffer = new byte[2048];

            SystemInt32 size = StreamToZipRead(buffer, 0, bufferLength);

            ZipStreamWrite(buffer, 0, size);

            try

            {

                while (size < StreamToZipLength)

                {

                    int sizeRead = StreamToZipRead(buffer, 0, bufferLength);

                    ZipStreamWrite(buffer, 0, sizeRead);

                    size += sizeRead;

                }

            }

            catch (SystemException ex)

            {

                throw ex;

            }

            finally

            {

                ZipStreamFinish();

                ZipStreamClose();

                StreamToZipClose();

            }

        }

 

        /// <summary>

        /// 压缩文件夹的方法

        /// </summary>

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

        {

            //压缩文件为空时默认与压缩文件夹同一级目录

            if (ZipedFile == stringEmpty)

            {

                ZipedFile = DirToZipSubstring(DirToZipLastIndexOf("\\") + 1);

                ZipedFile = DirToZipSubstring(0, DirToZipLastIndexOf("\\")) +"\\"+ ZipedFile+"zip";

            }

 

            if (PathGetExtension(ZipedFile) != "zip")

            {

                ZipedFile = ZipedFile + "zip";

            }

 

            using (ZipOutputStream zipoutputstream = new ZipOutputStream(FileCreate(ZipedFile)))

            {

                zipoutputstreamSetLevel(CompressionLevel);

                Crc32 crc = new Crc32();

                Hashtable fileList = getAllFies(DirToZip);

                foreach (DictionaryEntry item in fileList)

                {

                    FileStream fs = FileOpenRead(itemKeyToString());

                    byte[] buffer = new byte[fsLength];

                    fsRead(buffer, 0, bufferLength);

                    ZipEntry entry = new ZipEntry(itemKeyToString()Substring(DirToZipLength + 1));

                    entryDateTime = (DateTime)itemValue;

                    entrySize = fsLength;

                    fsClose();

                    crcReset();

                    crcUpdate(buffer);

                    entryCrc = crcValue;

                    zipoutputstreamPutNextEntry(entry);

                    zipoutputstreamWrite(buffer, 0, bufferLength);

                }

            }

        }

 

        /// <summary>

        /// 获取所有文件

        /// </summary>

        /// <returns></returns>

        private Hashtable getAllFies(string dir)

        {

            Hashtable FilesList = new Hashtable();

            DirectoryInfo fileDire = new DirectoryInfo(dir);

            if (!fileDireExists)

            {

                throw new SystemIOFileNotFoundException("目录:" + fileDireFullName + "没有找到!");

            }

 

            thisgetAllDirFiles(fileDire, FilesList);

            thisgetAllDirsFiles(fileDireGetDirectories(), 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 dirGetFiles(""))

                {

                    filesListAdd(fileFullName, fileLastWriteTime);

                }

                thisgetAllDirsFiles(dirGetDirectories(), filesList);

            }

        }

        /// <summary>

        /// 获取一个文件夹下的文件

        /// </summary>

        /// <param name="strDirName">目录名称</param>

        /// <param name="filesList">文件列表HastTable</param>

        private void getAllDirFiles(DirectoryInfo dir, Hashtable filesList)

        {

            foreach (FileInfo file in dirGetFiles(""))

            {

                filesListAdd(fileFullName, fileLastWriteTime);

            }

        }

    }

}

(2)UnZipcs

using SystemCollectionsGeneric;

using SystemLinq;

using SystemWeb;

 

/// <summary>

/// 解压文件

/// </summary>

 

using System;

using SystemText;

using SystemCollections;

using SystemIO;

using SystemDiagnostics;

using SystemRuntimeSerializationFormattersBinary;

using SystemData;

 

using ICSharpCodeSharpZipLibZip;

using ICSharpCodeSharpZipLibZipCompression;

using ICSharpCodeSharpZipLibZipCompressionStreams;

 

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 == stringEmpty)

            {

                throw new Exception("压缩文件不能为空!");

            }

            if (!FileExists(zipFilePath))

            {

                throw new SystemIOFileNotFoundException("压缩文件不存在!");

            }

            //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹

            if (unZipDir == stringEmpty)

                unZipDir = zipFilePathReplace(PathGetFileName(zipFilePath), PathGetFileNameWithoutExtension(zipFilePath));

            if (!unZipDirEndsWith("\\"))

                unZipDir += "\\";

            if (!DirectoryExists(unZipDir))

                DirectoryCreateDirectory(unZipDir);

 

            using (ZipInputStream s = new ZipInputStream(FileOpenRead(zipFilePath)))

            {

 

                ZipEntry theEntry;

                while ((theEntry = sGetNextEntry()) != null)

                {

                    string directoryName = PathGetDirectoryName(theEntryName);

                    string fileName = PathGetFileName(theEntryName);

                    if (directoryNameLength > 0)

                    {

                        DirectoryCreateDirectory(unZipDir + directoryName);

                    }

                    if (!directoryNameEndsWith("\\"))

                        directoryName += "\\";

                    if (fileName != StringEmpty)

                    {

                        using (FileStream streamWriter = FileCreate(unZipDir + theEntryName))

                        {

 

                            int size = 2048;

                            byte[] data = new byte[2048];

                            while (true)

                            {

                                size = sRead(data, 0, dataLength);

                                if (size > 0)

                                {

                                    streamWriterWrite(data, 0, size);

                                }

                                else

                                {

                                    break;

                                }

                            }

                        }

                    }

                }

            }

        }

    }

}

以上这两个类库可以直接在程序里新建类库,然后复制粘贴,直接调用即可。

主程序代码如下所示:

using System;

using SystemCollectionsGeneric;

using SystemLinq;

using SystemWeb;

using SystemWebUI;

using SystemWebUIWebControls;

using SystemDrawing;

 

using MicrosoftWin32;

using SystemDiagnostics;

 

 

namespace UpLoad

{

    public partial class UpLoadForm : SystemWebUIPage

    {

        protected void Page_Load(object sender, EventArgs e)

        {

 

        }

 

        protected void Button1_Click(object sender, EventArgs e)

        {

            if (TextBox1Text == "") //如果输入为空,则弹出提示

            {

                thisResponseWrite("<script>alert('输入为空,请重新输入!');windowopenerlocationhref=windowopenerlocationhref;</script>");

            }

            else

            {

                //压缩文件夹

                string zipPath = TextBox1TextTrim(); //获取将要压缩的路径(包括文件夹)

                string zipedPath = @"c:\temp"; //压缩文件夹的路径(包括文件夹)

                Zip Zc = new Zip();

                ZcZipDir(zipPath, zipedPath, 6);

                thisResponseWrite("<script>alert('压缩成功!');windowopenerlocationhref=windowopenerlocationhref;</script>");

 

                //解压文件夹

                UnZipClass unZip = new UnZipClass();

                unZipUnZip(zipedPath+ "zip", @"c:\temp"); //要解压文件夹的路径(包括文件名)和解压路径(temp文件夹下的文件就是输入路径文件夹下的文件)

                thisResponseWrite("<script>alert('解压成功!');windowopenerlocationhref=windowopenerlocationhref;</script>");

 

            }

        }

    }

}

本方法经过测试,均已实现。

另外,附上另外一种上传文件方法,经测试已实现,参考链接:http://blogncmemcom/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/ 

protected void Button1_Click(object sender, EventArgs e)

{

thisDownLoadFile("说明txt");

}

//下载函数

private void DownLoadFile(string fileName)

{

string filePath = ServerMapPath("") + "\\" + fileName;

if (FileExists(filePath))

{

FileInfo file = new FileInfo(filePath);

ResponseContentEncoding = SystemTextEncodingGetEncoding("UTF-8"); //解决中文乱码

ResponseAddHeader("Content-Disposition", "attachment; filename=" + ServerUrlEncode(fileName)); //解决中文文件名乱码

ResponseAddHeader("Content-length", fileLengthToString());

ResponseContentType = "appliction/octet-stream";

ResponseWriteFile(fileFullName);

ResponseEnd();

}

}

private void ResponDown(string fileName,string filepatch)

{

ResponseClear();

ResponseClearHeaders();

ResponseBuffer = false;

ResponseContentType = "application/ms-excel";

ResponseAppendHeader("Content-Disposition", "attachment;filename=" + HttpUtilityUrlEncode(fileName, SystemTextEncodingUTF8));

//ResponseWrite(writer);

FileStream file = new FileStream(filepatch, FileModeOpen, FileAccessRead, FileShareRead);

BinaryReader br = new BinaryReader(file);

ResponseAppendHeader("Content-Length", fileLengthToString());

// StringReader sr = new StringReader(writerGetStringBuilder()ToString());

long flen =fileLength;

int size = 102400;//每100k同时下载数据

byte[] readdata = new byte[size];//指定缓冲区的大小

if (size > flen) size = ConvertToInt32(flen);

long fpos = 0;

bool isend = false;

while (!isend)

{

if (ResponseIsClientConnected)

{

if ((fpos + size) > flen)

{

size = ConvertToInt32(flen - fpos);

readdata = new byte[size];

isend = true;

}

if (size > 1)

{

brRead(readdata, 0, size);//读入一个压缩块

// byte[] re = EncodingUTF8GetBytes(readdata, 0, readdataLength);

ResponseBinaryWrite(readdata);

//ResponseOutputStreamWrite(re, 0, size);

}

fpos += size;

}

else

{

ResponseEnd();

}

}

fileClose();

ResponseFlush();

ResponseEnd();

}

给你个下载函数

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » asp.net 点击“下载”弹出“下载文件”对话框,网页与要下载的文件不在同一服务器上,如何写?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情