强制下载文件对话框不工作 - ASP.NET C#

时间:2011-05-28 17:06:27

标签: c# asp.net download

我正在尝试在ASP.NET C#应用程序中实现强制下载文件对话框。我想强行下载的文件是Web服务器上不可在本地获得的媒体文件,但是从不同的位置提供服务。

我收到错误'http://remote-site-to-webserver/somefile.asf'不是有效的虚拟路径。

我在网上搜索了解决方案,但所有示例都指向使用Server.MapPath

的服务器上的相对路径

在下面的示例中,我创建了一个webhandler.ashx页面并将下载请求发送到此页面。

<%@ WebHandler Language="C#" Class="DownloadHandler" %>

using System;
using System.Web;

public class DownloadHandler : IHttpHandler {
public void ProcessRequest(HttpContext context) {
var fileName = "http://remote-site-to-webserver/somefile.asf";
var r = context.Response;
r.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
r.WriteFile(context.Server.MapPath(fileName));
}
public bool IsReusable { get { return false; } }
}

3 个答案:

答案 0 :(得分:1)

Content-Disposition标题对我来说不对。我认为应该是:

r.AddHeader("Content-Disposition", 
    "attachment; filename=DefaultNewFilename.ext");

文件名是下载文件的默认名称...或者换句话说,它是浏览器保存对话框中显示的内容。

您可能还需要:

r.AddHeader("Content-Type", "application/octetstream");

我不确定是否需要....但我总是把它包含在视频文件中等等。

答案 1 :(得分:0)

Server.MapPath() 

不用于远程http文件。它只是一个将虚拟地址转换为物理地址的工具,即您可以通过向Server.MapPath方法提供“〜/ Files / blah.txt”来检索“C:\ inetpub \ wwwroot \ MyWebSite \ Files \ blah.txt”。

如果您有兴趣从其他Web服务器下载文件,则必须使用HttpWebRequest类。

这是一个示例代码:

                HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("http://remote-site-to-webserver/somefile.asf");
                httpRequest.Credentials = CredentialCache.DefaultCredentials; //or a NetworkCredential if needed

                HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();

                Stream dataStream = httpResponse.GetResponseStream();

现在您可以将dataStream输出到您的回复中。

答案 2 :(得分:0)

为了从其他服务器开始下载,您需要向客户端发送重定向答案(Response.Redirect(mediaURL))。

因此,您无法从Web服务器强制下载对话框,因为浏览器会向其他服务器发送单独的请求。这必须在提供媒体的服务器上解决。

唯一的选择是您充当中间人,即将媒体文件下载到服务器并将其作为响应发送给客户端。如果它是一个容易适合内存的小文件,这应该不会太难。但是,如果它是一个大文件,它可能涉及一些棘手的编码,所以你可以分段接收和发送它。