我的网站中有一个页面,它在服务器上动态生成PDF报告,同时向用户浏览器显示“请稍候”消息。完成之后,它将唯一的文件路径放入会话中,然后打开download.aspx,这是空的,以及page_load函数中的以下c#代码。
string fileUID = (string)(Session["fileUID"]);
string FilePath = @fileUID;
byte[] fileBytes = System.IO.File.ReadAllBytes(FilePath);
string sFileName = "Report.pdf";
System.Web.HttpContext context = System.Web.HttpContext.Current;
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.ClearContent();
context.Response.AppendHeader("content-length", fileBytes.Length.ToString());
context.Response.ContentType = "application/octet-stream";
context.Response.AppendHeader("content-disposition", "attachment; filename=" + sFileName);
context.Response.BinaryWrite(fileBytes);
context.Response.Flush();
System.IO.File.Delete(FilePath);
context.ApplicationInstance.CompleteRequest();
在IE中,这会打开下载对话框,允许用户下载文件。但是在chrome,firefox和safari中,它只是永远位于等待页面上......
我还尝试为PDF文件指定mime类型,而不指定内容处理以在浏览器窗口中显示PDF,再次在Internet Explorer中完美运行,但不能在任何其他浏览器中完美运行。
在localhost上测试以及上传到服务器时都会出现问题。
我在这里和更广阔的世界都搜索过,似乎找不到其他人有同样的问题。
请有人告诉我我的方式错误。
答案 0 :(得分:0)
这就是我的做法
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";//check your valid file type
Response.AddHeader("Content-Disposition", "attachment;filename=" + targetFileName);
Response.Charset = "";
using (System.IO.StreamWriter writer = new StreamWriter(Response.OutputStream)
{
//writer.Write(contentBytes);
}
Response.Flush();
Response.Close();
Context.ApplicationInstance.CompleteRequest();
确保在调用CompletedRequest()之前关闭或处理所有流。
答案 1 :(得分:0)
感谢您的帮助。
问题在于请等待对话页面,我在其他浏览器中进行了调试,他们都讨厌window.location(页面)所以我把它改成了window.open(页面),它运行正常。
不知道我是怎么错过的。
答案 2 :(得分:0)
你应该在创建文件时设置cookie,如下所示:
var cookie = new HttpCookie("fileDownloadToken", _token);
cookie.Expires = DateTime.Now.AddMinutes(10);
cookie.Path = "/"; //Also set path
context.Response.AppendCookie(cookie);
和jquery.cookie插件的下一页如果将其设置为预期值,则读取cookie值,然后使用jquery blockui取消阻止ui:
<script type="text/javascript">
var fileDownloadCheckTimer;
function blockUIForDownload() {
var token = '1357.11.22';
$('#download_token_value').val(token);
$.blockUI({
message:$('#domMessage'),
css: {
padding: 10,
margin: 0,
width: '30%',
top: '50%',
left: '35%',
textAlign: 'center',
color: '#000',
border: '3px solid #aaa',
backgroundColor: '#fff',
cursor: 'wait',
}});
fileDownloadCheckTimer = window.setInterval(function () {
var cookieValue = $.cookie('fileDownloadToken');
//alert(cookieValue);
if (cookieValue == token)
finishDownload();
}, 1000);
}
function finishDownload() {
window.clearInterval(fileDownloadCheckTimer);
$.unblockUI();
$.cookie('fileDownloadToken', null, { path: '/' });
}
</script>