我们的ASP.NET Web应用程序中有一些文件浏览器。
它可以将驻留在外部的各种类型的文件流向用户。 现在一切都运行正常,但现在他们想要流式传输HTML文件并提出问题。
当我想在IE中流式传输HTML文件时,下载提示符不会给我打开它的选项,它只有“保存并另存为”选项。
我一直在谷歌搜索数天,但我唯一能找到的是如何关闭“打开”按钮,但我希望它在那里,而不是默认情况下。 Firefox和Chrome在下载提示中都有一个Open选项。
外部服务器上用于流式传输文件的代码如下:
注意:file是我们自己的文件对象的一个实例,它包含信息,如路径,文件名,标志,...关于我们要传输的文件
System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\\\MyFolder\\" + file.FullName);
if (fileInfo.Exists)
{
System.IO.FileStream fs = new System.IO.FileStream("C:\\\\MyFolder\\" + file.FullName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
string filename = file.Name.Replace(" ", "_");
page.Trace.IsEnabled = false;
page.Response.Expires = 0;
page.Response.Buffer = true;
page.Response.Clear();
page.Response.ContentType = MimeTypeParser.GetMimeType(fileInfo.FullName); //Gets the Correct content type: "text/html" in this case
page.Response.AddHeader("Content-Length", fs.Length.ToString());
page.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
int bufferSize = 8192;
// default to 4K, may want to use 8K instead
byte[] bytes = null;
bytes = new byte[bufferSize + 1];
int read = 0;
//Helper to read the bytes to the response steamer
while ((InlineAssignHelper(read, fs.Read(bytes, 0, bytes.Length))) != 0)
{
page.Response.OutputStream.Write(bytes, 0, read);
}
page.Response.OutputStream.Flush();
//close off response or else you get corrupted files
fs.Close();
page.Response.End();
}
else
{
page.Response.StatusCode = 404;
page.Response.End();
}
在应用程序本身上,以下代码用于从流转化器获取数据并将其推送到对客户端的响应:
public void StreamFile(int id, System.Web.HttpRequest clientRequest, System.Web.HttpResponse clientResponse)
{
try
{
OurDomain.File file = OurBLL.FileService.GetFile(id);
if (file != null)
{
string url = "http://FilestreamingServer?StreamFile.aspxid=" + file.Pkey + "&userName=" + userName;
Uri uri = new Uri(url);
System.Net.WebRequest request = System.Net.HttpWebRequest.Create(uri);
request.Method = System.Net.WebRequestMethods.Http.Get;
System.Net.WebResponse response = request.GetResponse();// 1st code block on the other server is invoked here
clientResponse.ContentType = response.Headers["Content-Type"];
clientResponse.AddHeader("Content-Length", response.Headers["Content-Length"]);
clientResponse.AppendHeader("Content-Disposition", response.Headers["Content-Disposition"]);
int bufferSize = 8192;
// default to 4K, may want to use 8K instead
byte[] bytes = null;
bytes = new byte[bufferSize + 1];
System.IO.Stream stream = response.GetResponseStream();
int read = 0;
while ((InlineAssignHelper(read, stream.Read(bytes, 0, bytes.Length))) != 0)
{
clientResponse.OutputStream.Write(bytes, 0, read);
}
clientResponse.OutputStream.Flush();
OurBLL.LogService.WriteDownloadLog(file);
//close off response or else you get corrupted files
clientResponse.End();
}
}
catch (System.Threading.ThreadAbortException ex)
{
//is due to response.end call.
}
catch (Exception ex)
{
//Log exception
}
}
当我查看F12中的响应时,我在响应中看到了预期的标题:
据我所知,所有选项都显示常规下载提示。
我错过了什么?
是否有标题标签强制提示打开“打开”选项,就像你有“X-Download-Options:noopen”将其关闭一样?
我知道您可以通过在Content-Disposition标题中添加“inline”而不是附件来在浏览器中打开文件,但这不是选项,因为它会在当前窗口中打开页面而我必须保留文件浏览开放。
答案 0 :(得分:0)
我有同样的问题。这就是我发现的:
注意:这仅适用于html文件。例如,如果您下载pdf文件并且打开pdf的默认程序设置为Internet Explorer,您仍将获得“打开”选项。
任何人都有更好的解决方案吗?