检测响应.二进制写入客户端
本文关键字:客户端 二进制 响应 检测 | 更新日期: 2023-09-27 18:32:49
我有一个带有图像按钮的页面。当用户单击图像按钮时,服务器会创建页面的 PDF,并将带有下载的响应发送回客户端。问题是这可能需要一些时间。我该如何/应该处理客户的等待?
我最初的想法是在显示加载器 GIF 的按钮上做一个 onClientClick 事件。但是我无法检测到响应何时完成,以便我可以再次隐藏它。我尝试使用RegisterStartupScript以及Response.Write([script]),但它似乎都被PDF的Response.BinaryWrite(buffer)覆盖了 - 文件被下载,但没有其他事情发生。
这是我的代码,只有下载逻辑:
protected void imgPrint_Click(object sender, ImageClickEventArgs e)
{
PDF pdf = new PDF();
byte[] buffer = pdf.ExportToPDF(Request.QueryString["id"].ToString(), Request.QueryString["mode"].ToString());
string att = "attachment; filename=" + Request.QueryString["mode"].ToString() + ".pdf";
Response.ClearContent();
Response.AddHeader("content-disposition", att);
Response.ContentType = "application/pdf";
Response.ContentEncoding = Encoding.Default;
Response.BinaryWrite(buffer);
}
以及带有当前仅显示警报的 onClientClick 事件的图像按钮:
<asp:ImageButton ID="imgPrint" runat="server"
ImageUrl="~/bilder/skriv_ut.png" Width="45" Height="36"
onclick="imgPrint_Click" OnClientClick="loader(true);" />
在 Web 表单中,您可以使用 Jquery 和 Webservice
function loader(show) {
if(show)
{
//show loading here
}
$.ajax({
type: "POST",
url: "MyService.asmx/myMethod",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
//do some thing & hide loading
},
error: function (data) {
//do some thing & hide loading
}
});
}
});
[WebService, ScriptService]
public class MyService : WebService
{
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string myMethod()
{
PDF pdf = new PDF();
byte[] buffer = pdf.ExportToPDF(Request.QueryString["id"].ToString(), Request.QueryString["mode"].ToString());
string att = "attachment; filename=" + Request.QueryString["mode"].ToString() + ".pdf";
Response.ClearContent();
Response.AddHeader("content-disposition", att);
Response.ContentType = "application/pdf";
Response.ContentEncoding = Encoding.Default;
Response.BinaryWrite(buffer);
return "ok";
}
}
通常,我对可下载的文件或图片使用Generic Handler
和Hyperlink
。
通用处理程序:
public class DocumentsHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
Document doc; // any type
if (doc!= null)
{
context.Response.ContentType = MimeMapping.GetMimeMapping(doc.FileName);
context.Response.AddHeader("Content-Disposition", string.Format("filename={0}", doc.FileName));
context.Response.OutputStream.Write(doc.Data, 0, doc.Data.Length);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
.cs页:
lnkDocument.NavigateUrl = String.Format("~/Handlers/DocumentsHandler.ashx?{0}",documentId);
当用户想要查看/下载文件时,他们单击超链接。在您的情况下,网页将立即加载,单击超链接后将进行耗时的过程。