如何实现文件下载?

wxcnl 2003-08-21 03:11:05
如果这个文件可以直接打开,例如.txt文件,他就直接在网页里面打开了,我的希望是,无论什么文件,只要一点击,就弹出一个保存对话框,进行保存,如何做?谢谢!
...全文
206 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lufeng 2003-08-25
  • 打赏
  • 举报
回复
我自己解决了,贴出来和大家共享。

Response.AppendHeader("Content-Disposition","attachment;
filename="+HttpUtility.UrlEncode(sFileName,System.Text.Encoding.Default));//sFileName文件名
Response.WriteFile(filePath);//filePath文件路径
Response.End();
lufeng 2003-08-25
  • 打赏
  • 举报
回复
To rotateclock() :
你的文件名是中文的也可以啊?
我的怎么不行?
why?
rotateclock 2003-08-22
  • 打赏
  • 举报
回复
asam2183(三山) ,你的方法最好了,即使文件名是中文也可以,其它的都会出现乱码。测试成功,谢了。可惜我不能结帖……
xunx 2003-08-21
  • 打赏
  • 举报
回复
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Net;
using System.Threading;

namespace Sx_Mdi
{

/// <summary>
/// Summary description for Class1.
/// </summary>
public class CIniFile
{
//文件INI名称
public string Path;
////声明读写INI文件的API函数
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);
[DllImport("kernel32")]

private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);

//类的构造函数,传递INI文件名
public CIniFile(string inipath)
{
//
// TODO: Add constructor logic here
//
Path = inipath;
}

//写INI文件
public void IniWriteValue(string Section,string Key,string Value)
{
WritePrivateProfileString(Section,Key,Value,this.Path);
}

//读取INI文件指定
public string IniReadValue(string Section,string Key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section,Key,"",temp,255,this.Path);
return temp.ToString();
}
}
public class CDownLoadFile
{
public string strSrcPath;
public string strTargetPath;
private WebClient client = new WebClient();
public CDownLoadFile()
{
strSrcPath = "";
strTargetPath = "";
}
public CDownLoadFile(string strSrc,string strTarget)
{
strSrcPath = strSrc;
strTargetPath = strTarget;
}
public string StartDownload()
{
string URL = strSrcPath;
int n = URL.LastIndexOf('/');
string URLAddress = URL;//.Substring(0,n);
string fileName = URL.Substring(n+1,URL.Length-n-1);
string Dir = strTargetPath;
string Path = Dir+'\\'+fileName;

try
{
WebRequest myre=WebRequest.Create(URLAddress);
}
catch(WebException exp)
{
return exp.Message;
}

try
{
//"开始下载文件...";
client.DownloadFile(URLAddress,fileName);
Stream str = client.OpenRead(URLAddress);
StreamReader reader = new StreamReader(str);
byte[] mbyte = new byte[1000000];
int allmybyte = (int)mbyte.Length;
int startmbyte = 0;
//"正在接收数据...";
while(allmybyte>0)
{
int m = str.Read(mbyte,startmbyte,allmybyte);
if(m==0)
break;

startmbyte+=m;
allmybyte-=m;
}

FileStream fstr = new FileStream(Path,FileMode.OpenOrCreate ,FileAccess.Write);
fstr.Write(mbyte,0,startmbyte);
str.Close();
fstr.Close();
}
catch(WebException exp)
{
return exp.Message;
// "";
}

return "";
}

}

}

asam2183 2003-08-21
  • 打赏
  • 举报
回复
Response.AppendHeader("Content-Disposition","attachment;
filename="+HttpUtility.UrlEncode(sFileName,System.Text.Encoding.UTF8));//sFileName文件名
Response.WriteFile(filePath);//filePath文件路径
Response.End();
rotateclock 2003-08-21
  • 打赏
  • 举报
回复
lhtyx() ,能不能对你的代码稍做解释?
wxcnl 2003-08-21
  • 打赏
  • 举报
回复
to panyee(快乐王子)

"strTemp"是谁麽意思?
lhtyx 2003-08-21
  • 打赏
  • 举报
回复
给你一段我写过的:
private void Page_Load(object sender, System.EventArgs e)
{
string file=Request.QueryString["file"];
FileInfo thisfile=new FileInfo(file);

Response.Clear();
Response.AddHeader("content-disposition","attachment;filename="+thisfile.Name);
Response.AddHeader("content-length",thisfile.Length.ToString());
Response.ContentType="application/octet-stream";
Response.WriteFile(thisfile.FullName);
Response.End();

}
panyee 2003-08-21
  • 打赏
  • 举报
回复
用aspx读取文件输出它
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=" & strFileName);
Response.BinaryWrite(strTemp);
panyee 2003-08-21
  • 打赏
  • 举报
回复
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=" & strFileName);
Response.BinaryWrite(strTemp);
mongtze 2003-08-21
  • 打赏
  • 举报
回复
做个超链接就可以啊。
acewang 2003-08-21
  • 打赏
  • 举报
回复
Web开发人员都有过这样的疑问,如何让一个文件,尤其是一个已知类型的文件,发送到客
户端,直接提示让浏览者下载,而不是用与它相关联的程序打开。以前我们最常用的办法
就是把这样的文件加到链接上,这样可以让浏览者通过点击鼠标右键的目标另存为来下载
所链接的文件。但是,这样有两个不足的地方:
一是:如果浏览器能够识别已下载文件的扩展名,则浏览器就会激活该扩展名所关联的程
序来打开所下载的文件。比如:在Windows平台上,如果用户点击的链接链接的是一个“.
doc”文件的话,那么,浏览器就会启动Microsoft Word应用程序来打开它。
二是:如果采用链接的办法的话,任何能看到该链接的人都可以下载该文件,你虽然也可
以对所下载的文件进行权限设置,但那样做也不是很方便的。有时候我们需要更为灵活和
富有弹性的方式,下面的程序能够很方便地克服以上两方面的不足。
这种办法是可靠的,但你必须记住:没有授权的用户不能够通过在浏览器地址栏里输入文
件的URL来取得该文件的下载权。所以,要下载的文件应该放到虚拟目录之外的一个目录里
,比如:如果你的虚拟目录是C:\Mengxianhui\Tomcat4\Website\MyApp的话,那么,存放
在该目录和该目录下的任何子目录下所有文件对因特网上的任何用户都是可见的。要直接
下载一个文件,我们需要做两件事,第一件事是:设定响应的内容类为“application/oc
tet-stream”,大小写无关。第二件事是:设置HTTP的响应头名字为:Content-Disposit
ion,设定值为:attachment; filename = theFileName。这里的theFileName就是出现在
文件下载对话框里的默认文件名,通常和所下载的文件名字相同,但也可以不同。下面,
我们就平常最常用的JSP和ASP页面来举一个实际应用的例子。
TestFileDownload.ASP页面的例子:

在ASP里,没有提供从文件读取文件流信息的方法,因此,为了得到文件的流信息,我们
必须借助其他的工具,最简单的就是编写一个VB或C的DLL组件,让组件返回文件的流信息
。下面是一个用VB编写的DLL的例子,工程名字为MengXHFileDownLoad,类模块的名字为B
inReadFromFile,类方法readBinFromFile如下:
 
Function readBinFromFile(ByVal bfilename As String) As Variant
   Dim fl As Long
   Dim FileNum As Long
   Dim binbyte() As Byte
   Dim binfilestr As String
  
   On Error GoTo errHandler  
   FileNum = FreeFile  
   Open bfilename For Binary As #FileNum  
   fl = FileLen(bfilename)
   ReDim binbyte(fl)  
   Get #FileNum, , binbyte  
   Close #FileNum  
   readBinFromFile = binbyte
   Exit Function
     
errHandler:
   Exit Function
End Function

把上面的代码编译成MengXHFileDownLoad.DLL,然后注册即可使用。下面以直接下载一个
When A Man Loves A Woman.mp3的MP3文件为例子,我们要编写的ASP脚本代码如下:

 <%@ Language=VBScript %>
 <%
  Response.buffer = TRUE
  Response.ContentType = "APPLICATION/OCTET-STREAM"
  Response.AddHeader "Content-Disposition","attachment;filename=When A Man Lo
ves A Woman.mp3"
 
  Dim varStream, oMyObject
  
  Set oMyObject = Server.CreateObject("MengXHFileDownLoad.BinReadFromFile")

  varStream = oMyObject.readBinFromFile("E:\MengXianhui\Mp3\When A Man Loves
A Woman.mp3")
  Response.BinaryWrite(varStream)
  Set oMyObject = Nothing
 
  Response.End
 %>

当我们运行上面的TestFileDownload.ASP文件时,浏览器会弹出一个文件下载的对话框,
提示我们下载,而不是用默认的MP3播放器打开。
这种方法也可以把我们的ASP页面生成的HTML源代码保存成一个文件,下面的代码会提示
你把ASP执行的结果保存成Test.htm文件。具体的方法是:
 <%
  Response.ContentType = "APPLICATION/OCTET-STREAM"
  Response.AddHeader "Content-Disposition","attachment;filename=Test.htm"
  Response.write "<div style='background-color:navy;color:#FFFFFF'>测试</div>
"
  Response.write "<a href='http://lucky.myrice.com>"
  Response.write "<img src='></a>"
  Response.End
 %>

当我们的文件数目很少时,也可以直接在服务器端进行设置,让这些文件直接下载。具体
做法是:在Internet服务管理器里,选“属性”项,然后选“HTTP Headers”标签页进行
设置即可!!

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧