asp.net 点击“下载”弹出“下载文件”对话框,网页与要下载的文件不在同一服务器上,如何写?
嗯,这个其实就是一个超链接连过去就行了。要知道远程文件的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();
}
给你个下载函数
0条评论