在我的网络应用程序中,我有一个aspx页面,其中包含一个html表和几行文本。我需要用户能够将整个页面作为单独的文件下载。
在过去,我使用了一个webclient来执行此操作:
Dim myWebClient As New System.Net.WebClient
myWebClient.DownloadFile(strSource, strDest)
Response.AddHeader("Content-Disposition", "attachment;filename=test.doc")
Response.Write("test.doc")
但似乎这只能下载html页面。
可以这样做吗?
答案 0 :(得分:3)
您只能下载HTML的原因是 .aspx不通过互联网提供(仅生成HTML)。
当您执行myWebClient.DownloadFile()
时,应用程序只是向URI发出GET请求并保存生成的HTML。 .aspx永远不会离开服务器 - 而是处理服务器端,导致你最终得到的HTML。
答案 1 :(得分:1)
.ASPX是一个脚本页面,因此您无法实际下载原始ASPX。另一端的IIS服务器有一个.aspx处理程序,导致.NET处理它。通常,您不希望服务器返回原始ASPX源。
在服务器端需要特殊处理才能获得原始ASPX页面。例如,您可以创建一个为您执行此操作的ASHX脚本处理程序,您可以请求类似getfile.ashx?filename=myfile.aspx
的内容,并且getfile.ashx处理程序将从磁盘读取ASPX页面并将其写为响应。 (安全说明:如果这是您选择的路由,请确保清理指定的页面,以便它们不会像getfile.ashx?filename=C:\my\secret\file.txt
那样做一些愚蠢的事情。将该处理程序的信任级别设置为更好中等或更低。
但这一切都需要服务器端开发。从客户端来看,在服务器想要播放之前,您无法做任何事情。
以下是文件处理程序的示例:
public class MyHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
var file = context.Request.QueryString["file"];
//Make sure to do your security checks on the file path here.
using (var source = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
{
source.CopyTo(context.Response.OutputStream);
}
}
}
您可以在ASHX内部或通过web.config中的httpHandlers
部分设置处理程序。
或者,如果您使用的是MVC2 +,则不需要HTTP处理程序,因为您只需使用操作即可实现相同的操作:
public ActionResult GetFile(string path)
{
//Make sure to do your security checks
using (var source = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
return File(source, "text/html");
}
}