<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Hopes

    Start Here..

     

    Asp.net生成Excel文件并下載(更新:解決使用迅雷下載頁面而不是文件的問題)


    一)

    如果在迅雷的下載對話框中點(diǎn)取消,則會使用IE的下載,這里的文件又是正確的了:


    懷疑迅雷是根據(jù)下載對話框中的網(wǎng)址重新請求下載,與發(fā)起請求的頁面已經(jīng)無關(guān),而IE又不會把ViewState信息傳到迅雷中,導(dǎo)致下載的文件不是想要的Excel頁面。

    之后又嘗試了分段下載的方式,其實(shí)也是無效的,因?yàn)檠咐赘静焕頃闾峁┙o它的下載機(jī)制,而且這樣在Firefox下調(diào)用迅雷時(shí),由于分段下載的Viewstate并不包含Excel文件的完整信息,迅雷下載下的也是殘缺的文件。

    最后只能采用最老土的解決方法:Response.Redirect(),轉(zhuǎn)向?qū)嶋H文件地址。
    FileInfo fi = new FileInfo(excelFile);
    HttpResponse contextResponse = HttpContext.Current.Response;
    contextResponse.Redirect(string.Format("~/Template/{0}", excelName), false);

    這樣在三個(gè)瀏覽器下測試都正常了,因?yàn)檎埱蟮氖菍?shí)際文件的地址,在迅雷中顯示的也是實(shí)際文件的地址。下載就不會出現(xiàn)問題。但這樣相當(dāng)于告知客戶端用戶文件的實(shí)際地址,隱私性不佳。但好在這里并不需要太好的隱私性,而且文件會在一定時(shí)間之后刪除,所以倒并不是太大的問題了。



    上面是第一次考慮的結(jié)果,似乎還是有些懶了……

    事后考慮,既然每次迅雷實(shí)際都是重新請求URL,那么我們就應(yīng)該給迅雷傳入一個(gè)能生成Excel文件的URL。

    即,在點(diǎn)擊“生成Excel”按鈕的時(shí)候,轉(zhuǎn)向另一個(gè)Export頁面,在這個(gè)頁面的Page_Load方法中完成生成Excel文件、下載Excel文件的步驟。
    String fileName = Request.QueryString["FileName"];
    String exportName = Request.QueryString["Export"];
    if(fileName != null)
    {
    ExportManger.CreateExcel(fileName);//先在服務(wù)器端創(chuàng)建Excel文件。
    Response.Redirect(String.Format("{0}?Export={1}",Request.Path.ToString(),fileName));//重定向到本頁面,但Query參數(shù)變?yōu)镋xport。
    }
    else if(exportName != null)
    {
    ExportManger.ExportExcel(exportName);//下載Excel文件。
    }

    這里頁面跳轉(zhuǎn)了兩次,第一次是生成Excel,第二次是下載Excel。

    之所以跳轉(zhuǎn)兩次,是因?yàn)檠咐讜东@最后的URL,如果生成和下載放在一起進(jìn)行,那么迅雷下載時(shí)會重復(fù)再生成一遍Excel文件。下載Excel文件的代碼ExportManger.ExportExcel(exportName)就使用了本文開頭介紹的Response.Write方法,也可以用分段下載的方法:
    if(fi.Length > 0)
    {
    FileStream sr = new FileStream(fi.FullName,System.IO.FileMode.Open,System.IO.FileAccess.Read, System.IO.FileShare.Read);
    int size = 1024;//設(shè)置每次讀取長度。
    for (int i = 0; i < fi.Length / size + 1; i++)
    {
    byte[] buffer = new byte[size];
    int length = sr.Read(buffer, 0, size);
    contextResponse.OutputStream.Write(buffer, 0, length);
    }
    sr.Close();
    }
    else
    {
    contextResponse.WriteFile(fi.FullName);
    }



    這里的結(jié)果是只生成了一次Excel并在服務(wù)器保留,以后每次下載的時(shí)候都使用帶"Export"的參數(shù)下載相同的文件。那么如果需要文件只是一次性的,每次下載都需要重新生成,則只需要把Export頁面的下載和生成放到一起。然后把開頭的Response.Write方法最后變成:
    contextResponse.Flush();
    fi.Delete();
    contextResponse.End();
    即每次響應(yīng)清空后把文件先刪除,再結(jié)束響應(yīng)。

    這樣就解決了利用下載工具出現(xiàn)的下載不能的問題,同時(shí)保護(hù)了服務(wù)器文件地址的隱私,并可以采用分段寫入的方法寫入大文件,而且可以按需要即時(shí)刪除生成的文件而不占用服務(wù)器空間。


    二)

    用超級鏈接就行. 
    <a href="這里用ASP.NET輸出數(shù)據(jù)庫中你的文件名稱(包括路徑)" title="點(diǎn)擊下載(這個(gè)標(biāo)記是你鼠標(biāo)劃過鏈接是提示的文字)" target="_blank">文件名稱</a> 
    target="_blank" 是新打開網(wǎng)頁,而不是在當(dāng)前頁跳轉(zhuǎn).

    新建一個(gè)download.aspx?filename='aa'頁面專門用來下載,并將要下載的文件名傳給這個(gè)頁面,然后在這個(gè)頁面寫以下代碼
    string filename=Request.QueryString(["filename"]);
    FileInfo DownloadFile = new FileInfo("../FILE/"+filename); //設(shè)置要下載的文件
    if(DownloadFile.isExists)
    {
    Response.Clear(); //清除緩沖區(qū)流中的所有內(nèi)容輸出
    Response.ClearHeaders(); //清除緩沖區(qū)流中的所有頭
    Response.Buffer = false; //設(shè)置緩沖輸出為false
    Response.ContentType = "application/octet-stream";//將 HTTP 頭添加到輸出流
    Response.AppendHeader("Content-Disposition", "attachment;filename=" +HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8));
    Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());
    Response.WriteFile(DownloadFile.FullName);
    Response.Flush(); //向客戶端發(fā)送當(dāng)前所有緩沖的輸出
    Response.End(); //將當(dāng)前所有緩沖的輸出發(fā)送到客戶端
    Response.Close();
    }



    posted on 2012-10-26 21:09 ** 閱讀(161) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    你好!

    常用鏈接

    留言簿(2)

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊

    收藏夾

    C#學(xué)習(xí)

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 四虎一区二区成人免费影院网址 | 羞羞网站在线免费观看| 一个人免费观看www视频在线| 亚洲成a人片77777老司机| a色毛片免费视频| 国产成人亚洲综合无码精品| 无码人妻AV免费一区二区三区| 亚洲日韩小电影在线观看| baoyu122.永久免费视频| 亚洲狠狠婷婷综合久久久久| 在线免费观看伊人三级电影| 国产亚洲人成网站观看| 免费国产在线视频| 亚洲视频在线观看一区| 在线永久看片免费的视频| 亚洲av极品无码专区在线观看| 一二三四免费观看在线视频中文版| 亚洲国产最大av| 免费大片在线观看网站| 日产久久强奸免费的看| 国产亚洲色婷婷久久99精品| 免费无码VA一区二区三区| 亚洲ts人妖网站| 亚洲精品岛国片在线观看| 精品国产麻豆免费人成网站| 亚洲综合视频在线观看| 暖暖免费高清日本中文| 好吊色永久免费视频大全| 亚洲成年轻人电影网站www| 成人五级毛片免费播放| jizz18免费视频| 亚洲美女aⅴ久久久91| 国产精品免费电影| 久青草视频97国内免费影视| 亚洲经典在线中文字幕| 国产婷婷高清在线观看免费| 大地资源网高清在线观看免费| 亚洲av无码久久忘忧草| 亚洲国产成人乱码精品女人久久久不卡 | 亚洲精品蜜夜内射| 亚洲区小说区图片区QVOD|