我正在尝试在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; } }
}
答案 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服务器强制下载对话框,因为浏览器会向其他服务器发送单独的请求。这必须在提供媒体的服务器上解决。
唯一的选择是您充当中间人,即将媒体文件下载到服务器并将其作为响应发送给客户端。如果它是一个容易适合内存的小文件,这应该不会太难。但是,如果它是一个大文件,它可能涉及一些棘手的编码,所以你可以分段接收和发送它。