在服务器端写什么代码可以实现在客户端下载一个文件(不用window.open()方法)?

时间:2021-02-15 17:53:34
在服务器端写Respopnse.Write("<script>window.open('xxx.xls','','');</script>");
可以实现打开一个新窗口,因为新窗口指向一个Excel文件,所以可以实现下载。
但是,这样做会打开一个空窗口。有没有办法可以直接显示“文件另存为对话框”,而不用打开新的窗口就可以实现文件的下载?

11 个解决方案

#1


直接用<a src=xxx.xls></a>

#2


給你一個函數吧,直接下載文件,絕對不會有任何不好的地方,看完後快給份,嘻嘻~~

/// <summary>
/// 打开指定的文件
/// </summary>
/// <param name="PathName">路径(相对路径)</param>
/// <param name="FileName">文件名(带扩展名)</param>
public void OpenFile(Page page, string PathName, string FileName)
{
string name = PathName + FileName;
FileInfo aFile = new FileInfo(page.Server.MapPath(name));
string na = Path.GetFileName(name);
page.Response.Clear();
page.Response.ClearHeaders();
page.Response.BufferOutput = false;
page.Response.ContentType = "application/octet-stream";
page.Response.AppendHeader("Content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8));
page.Response.AddHeader("Content-Length", aFile.Length.ToString());
page.Response.WriteFile(name);
page.Response.Flush();
page.Response.End();
}

#3


谢谢两位回复,clerkie(振兴中华,抵制日货!)的方法可以用,xiaopai20(生活=懒觉+考试)说的方法我不太明白什么意思,不知道怎么用,用Response.write()方法把你说的写到页面上以后没有出现下载文件。 
有没有办法能在浏览器端直接显示一个“文件另存为”对话框,实现从服务器端下载一个文件?

#4


<a href="***.xls"></a>

#5


我刚才又试了一下,clerkie(振兴中华,抵制日货!)的方法会弹出两次“打开/保存”对话框,第二次才出现“文件另存为”对话框,而且其中的默认名是页面的名字,扩展名是.htm。
这样不太方便。如果在浏览器端直接显示一个“文件另存为”对话框不容易的话,有没有办法让clerkie(振兴中华,抵制日货!)的方法只显示一次“打开/保存”对话框,并且“另存为”对话框里的默认文件名的扩展名是.xls?

#6


呵,我的方法本来就只是显示一次保存对话框而已,是不是你搞错了什么~~?

#7


我又改了一下,你用这个函数试试吧:

/// <summary>
/// 打开指定的文件
/// </summary>
/// <param name="PathName">路径(相对路径)</param>
/// <param name="FileName">文件名(带扩展名)</param>
public void OpenFile(string PathName, string FileName)
{
string name = PathName + FileName;
FileInfo aFile = new FileInfo(Server.MapPath(name));
string na = Path.GetFileName(name);
Response.Clear();
Response.ClearHeaders();
Response.BufferOutput = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8));
Response.AddHeader("Content-Length", aFile.Length.ToString());
Response.WriteFile(name);
Response.Flush();
Response.End();
}

#8


谢谢clerkie(振兴中华,抵制日货!) ,你修改后的函数一切正常了,只显示一次“打开或保存”对话框,点击保存后,出来“文件另存为”对话框...
我还有一个问题想问,能不能让浏览器端不显示“打开或保存”对话框,直接在浏览器端显示一个“文件另为”对话框来实现下载文件?多谢了,另外,哪里有这方面的资料,能给个网址就更好了。
明天再结帖,大家可以给我发邮件:Leinwood@eyou.com

#9


你这个要求用B/S的编程是无法达到的,毕竟B/S不能控制客户机~~

#10


谢谢,这个问题我自己再考虑考虑吧,看能不能用别的办法实现这个功能。
我看到别人做的页面,用了一个控件,点击一个<input>之后,直接弹出一个“文件另存为”对话框,然后可以根据控件中的数据,直接在客户端生成一个EXCEL文件,客户就是想让我们做出这样的效果。
这个问题以后再说,昨天网络出了点问题,要不然昨天就结帖了。

#11


mark

#1


直接用<a src=xxx.xls></a>

#2


給你一個函數吧,直接下載文件,絕對不會有任何不好的地方,看完後快給份,嘻嘻~~

/// <summary>
/// 打开指定的文件
/// </summary>
/// <param name="PathName">路径(相对路径)</param>
/// <param name="FileName">文件名(带扩展名)</param>
public void OpenFile(Page page, string PathName, string FileName)
{
string name = PathName + FileName;
FileInfo aFile = new FileInfo(page.Server.MapPath(name));
string na = Path.GetFileName(name);
page.Response.Clear();
page.Response.ClearHeaders();
page.Response.BufferOutput = false;
page.Response.ContentType = "application/octet-stream";
page.Response.AppendHeader("Content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8));
page.Response.AddHeader("Content-Length", aFile.Length.ToString());
page.Response.WriteFile(name);
page.Response.Flush();
page.Response.End();
}

#3


谢谢两位回复,clerkie(振兴中华,抵制日货!)的方法可以用,xiaopai20(生活=懒觉+考试)说的方法我不太明白什么意思,不知道怎么用,用Response.write()方法把你说的写到页面上以后没有出现下载文件。 
有没有办法能在浏览器端直接显示一个“文件另存为”对话框,实现从服务器端下载一个文件?

#4


<a href="***.xls"></a>

#5


我刚才又试了一下,clerkie(振兴中华,抵制日货!)的方法会弹出两次“打开/保存”对话框,第二次才出现“文件另存为”对话框,而且其中的默认名是页面的名字,扩展名是.htm。
这样不太方便。如果在浏览器端直接显示一个“文件另存为”对话框不容易的话,有没有办法让clerkie(振兴中华,抵制日货!)的方法只显示一次“打开/保存”对话框,并且“另存为”对话框里的默认文件名的扩展名是.xls?

#6


呵,我的方法本来就只是显示一次保存对话框而已,是不是你搞错了什么~~?

#7


我又改了一下,你用这个函数试试吧:

/// <summary>
/// 打开指定的文件
/// </summary>
/// <param name="PathName">路径(相对路径)</param>
/// <param name="FileName">文件名(带扩展名)</param>
public void OpenFile(string PathName, string FileName)
{
string name = PathName + FileName;
FileInfo aFile = new FileInfo(Server.MapPath(name));
string na = Path.GetFileName(name);
Response.Clear();
Response.ClearHeaders();
Response.BufferOutput = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8));
Response.AddHeader("Content-Length", aFile.Length.ToString());
Response.WriteFile(name);
Response.Flush();
Response.End();
}

#8


谢谢clerkie(振兴中华,抵制日货!) ,你修改后的函数一切正常了,只显示一次“打开或保存”对话框,点击保存后,出来“文件另存为”对话框...
我还有一个问题想问,能不能让浏览器端不显示“打开或保存”对话框,直接在浏览器端显示一个“文件另为”对话框来实现下载文件?多谢了,另外,哪里有这方面的资料,能给个网址就更好了。
明天再结帖,大家可以给我发邮件:Leinwood@eyou.com

#9


你这个要求用B/S的编程是无法达到的,毕竟B/S不能控制客户机~~

#10


谢谢,这个问题我自己再考虑考虑吧,看能不能用别的办法实现这个功能。
我看到别人做的页面,用了一个控件,点击一个<input>之后,直接弹出一个“文件另存为”对话框,然后可以根据控件中的数据,直接在客户端生成一个EXCEL文件,客户就是想让我们做出这样的效果。
这个问题以后再说,昨天网络出了点问题,要不然昨天就结帖了。

#11


mark