ReportViewer自己寫自定義檔名並下載PDF按鈕
但你就是會遇到一些(
能不能直接就下載,不要讓我另存新檔,
而且可以幫我把檔名命名完畢!(只有更懶沒有最懶!!!)
好阿~閒閒沒事,我就來幫你想辦法,
(其實我也很懶,引言直接從上一篇複製過來!)
其實就是在Server端產生PDF檔,然後下載而已。
缺點就是,Server上的PDF檔,得另外清理了。
- 同樣的我們得準備將報表產生為PDF檔的function
private string CreateFile(string szFileType, string szfilename)
{
string sMSG = "";
Warning[] warnings;
string[] streamids;
string mimeType;
string encoding = "utf-8";
string extension;
try
{
byte[] bytes = this.ReportViewer1.LocalReport.Render(szFileType.ToUpper(), null, out mimeType,
out encoding, out extension, out streamids, out warnings);
FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(szfilename), FileMode.Create);
fs.Write(bytes, 0, bytes.Length);
fs.Close();
fs.Dispose();
}
catch (Exception ex)
{
sMSG = ex.Message.ToString();
}
return sMSG;
}
- 接著再準備一個直接下載檔案的function
public string DownloadFile(string path, string name)
{
string sMSG = "";
try
{
System.IO.FileInfo file = new System.IO.FileInfo(HttpContext.Current.Server.MapPath(path));
Response.Clear();
Response.Charset = "utf-8";
Response.ContentEncoding = System.Text.Encoding.UTF8;
// 添加頭資訊,為"檔案下載/另存為"對話方塊指定默認檔案名
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name));
// 添加頭資訊,指定檔大小,讓流覽器能夠顯示下載進度
Response.AddHeader("Content-Length", file.Length.ToString());
// 指定返回的是一個不能被用戶端讀取的stream,必須被下載
Response.ContentType = "application/octet-stream";
// 把文件stream發送到用戶端
Response.WriteFile(file.FullName);
// 停止頁面的執行
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
catch (Exception ex)
{
sMSG = ex.Message.ToString();
}
return sMSG;
}
- 最後就是我們的下載按鈕
protected void btnSavePDF_Click(object sender, EventArgs e)
{
string sOutPutFile, sServerFile, sMSG;
sOutPutFile = "檔名_" + Request.QueryString["eventID"].ToString() + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
sServerFile = @"~/temp/檔名_" + Request.QueryString["eventID"].ToString() + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
sMSG = CreateFile("PDF", sServerFile);
if (sMSG.Equals(""))
{
sMSG = DownloadFile(sServerFile, sOutPutFile);
if (!sMSG.Equals(""))
ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('" + sMSG + "');", true);
}
else
ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('" + sMSG + "');", true);
}
沒有留言:
張貼留言