最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2012年01月09日 12:06:25   作者:  
Asp.net生成Excel文件并下載(更新:解決使用迅雷下載頁面而不是文件的問題)
這里采用的是在服務端先生成Excel文件,然后利用文件地址下載的方法。

生成Excel文件的方法,見:【原】.Net創(chuàng)建Excel文件(插入數據、修改格式、生成圖表)的方法

先試用Response.WriteFile的方法:
復制代碼 代碼如下:

FileInfo fi = new FileInfo(excelFile);//excelFile為文件在服務器上的地址
HttpResponse contextResponse = HttpContext.Current.Response;
contextResponse.Clear();
contextResponse.Buffer = true;
contextResponse.Charset = "GB2312"; //設置了類型為中文防止亂碼的出現
contextResponse.AppendHeader("Content-Disposition", String.Format("attachment;filename={0}", excelName)); //定義輸出文件和文件名
contextResponse.AppendHeader("Content-Length", fi.Length.ToString());
contextResponse.ContentEncoding = Encoding.Default;
contextResponse.ContentType = "application/ms-excel";//設置輸出文件類型為excel文件。

contextResponse.WriteFile(fi.FullName);
contextResponse.Flush();
contextResponse.End();

其中第一行的excelFile為Excel文件在服務器上的地址,比如:“C:\Website\Excel\xx.xlsx”。

這種方法也是網上一般提供的方法,但在實際操作中,卻出現了意向不到的問題:

在Chrome下

一切正常,Excel文件直接下載到Chrome的默認下載文件夾中。

image

在Firefox下

由于安裝了FlashGot插件,會先選擇應用的下載工具:

image

在這里顯示是正常的,如果選擇“保存文件”,Excel文件也會被保存到默認文件夾中,但如果試用第三方下載工具,比如迅雷,會出現如下窗口:

image

 

 

注意到網址一欄,會在頁面實際地址后添加ViewState信息,而另存名稱也不是Excel文件本身的名稱,而是頁面的名稱。

點擊確定后,被下載的文件又變成了實際文件(有時會先變成.zip文件,再變?yōu)閷嶋H文件)

image

在IE7下

image

會先彈出保存對話框,文件正常,同樣因為裝了迅雷的緣故,點保存時,彈出迅雷的下載對話框,和Firefox下不同,網址后面沒有ViewState信息。

image 

點確定,下載的則是頁面文件:

image

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

image

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

之后又嘗試了分段下載的方式,其實也是無效的,因為迅雷根本不理會你提供給它的下載機制,而且這樣在Firefox下調用迅雷時,由于分段下載的Viewstate并不包含Excel文件的完整信息,迅雷下載下的也是殘缺的文件。

最后只能采用最老土的解決方法:Response.Redirect(),轉向實際文件地址。

復制代碼 代碼如下:

FileInfo fi = new FileInfo(excelFile);
HttpResponse contextResponse = HttpContext.Current.Response;
contextResponse.Redirect(string.Format("~/Template/{0}", excelName), false);

這樣在三個瀏覽器下測試都正常了,因為請求的是實際文件的地址,在迅雷中顯示的也是實際文件的地址。下載就不會出現問題。但這樣相當于告知客戶端用戶文件的實際地址,隱私性不佳。但好在這里并不需要太好的隱私性,而且文件會在一定時間之后刪除,所以倒并不是太大的問題了。

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

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

即,在點擊“生成Excel”按鈕的時候,轉向另一個Export頁面,在這個頁面的Page_Load方法中完成生成Excel文件、下載Excel文件的步驟。
復制代碼 代碼如下:

String fileName = Request.QueryString["FileName"];
String exportName = Request.QueryString["Export"];
if(fileName != null)
{
ExportManger.CreateExcel(fileName);//先在服務器端創(chuàng)建Excel文件。
Response.Redirect(String.Format("{0}?Export={1}",Request.Path.ToString(),fileName));//重定向到本頁面,但Query參數變?yōu)镋xport。
}
else if(exportName != null)
{
ExportManger.ExportExcel(exportName);//下載Excel文件。
}

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

之所以跳轉兩次,是因為迅雷會捕獲最后的URL,如果生成和下載放在一起進行,那么迅雷下載時會重復再生成一遍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;//設置每次讀取長度。
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);
}

這里的結果是只生成了一次Excel并在服務器保留,以后每次下載的時候都使用帶"Export"的參數下載相同的文件。那么如果需要文件只是一次性的,每次下載都需要重新生成,則只需要把Export頁面的下載和生成放到一起。然后把開頭的Response.Write方法最后變成:
復制代碼 代碼如下:

contextResponse.Flush();
fi.Delete();
contextResponse.End();

即每次響應清空后把文件先刪除,再結束響應。這樣就解決了利用下載工具出現的下載不能的問題,同時保護了服務器文件地址的隱私,并可以采用分段寫入的方法寫入大文件,而且可以按需要即時刪除生成的文件而不占用服務器空間。

相關文章

  • ASP.NET網站聊天室的設計與實現(第3節(jié))

    ASP.NET網站聊天室的設計與實現(第3節(jié))

    這篇文章主要介紹了ASP.NET網站聊天室的設計與實現,了解Session、Application對象的屬性和事件,并且掌握利用它們在頁面間保存和傳遞數據的方法,需要的朋友可以參考下
    2015-08-08
  • *.ashx文件不能訪問Session值的解決方法

    *.ashx文件不能訪問Session值的解決方法

    這篇文章主要介紹了*.ashx文件不能訪問Session值的解決方法,只需在頭部引用一個命名空間即可解決問題,非常實用,需要的朋友可以參考下
    2014-09-09
  • asp.net core2.2多用戶驗證與授權示例詳解

    asp.net core2.2多用戶驗證與授權示例詳解

    這篇文章主要給大家介紹了關于asp.net core2.2多用戶驗證與授權的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-01-01
  • VS2010新建站點發(fā)布并訪問步驟詳解

    VS2010新建站點發(fā)布并訪問步驟詳解

    這篇文章主要介紹了VS2010新建站點發(fā)布并訪問詳細步驟,主要以具體每個步驟截圖的形式從站點新建,配置IIS再到發(fā)布和訪問網站進行講解,需要的朋友可以參考下
    2015-08-08
  • ajax.net對數據庫的插入實例

    ajax.net對數據庫的插入實例

    ajax.net對數據庫的插入實例,需要的朋友可以參考一下
    2013-04-04
  • ASP.NET實現根據IP獲取省市地址的方法

    ASP.NET實現根據IP獲取省市地址的方法

    這篇文章主要介紹了ASP.NET實現根據IP獲取省市地址的方法,主要基于QQwry.dat純真IP數據庫來實現這一功能,非常實用,需要的朋友可以參考下
    2014-10-10
  • .Net?Core跨平臺應用開發(fā)串口篇HelloArm

    .Net?Core跨平臺應用開發(fā)串口篇HelloArm

    這篇文章介紹了.Net?Core跨平臺應用開發(fā)串口篇HelloArm,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-01-01
  • .NET根據文件的哈希值篩選重復文件的實現思路

    .NET根據文件的哈希值篩選重復文件的實現思路

    文章介紹了文件哈希值的概念,包括哈希算法、唯一性、固定長度、不可逆性以及其在文件驗證、數據完整性檢查、文件去重、密碼存儲等領域的應用,接著,通過一個示例代碼說明了如何通過文件大小分組并比對哈希值來篩選出重復文件,感興趣的朋友一起看看吧
    2025-03-03
  • 當年學習ADO.NET的筆記

    當年學習ADO.NET的筆記

    那些年學習了ASP.NET后又開始學習ASP.NET的新知識,ADO.NET用于訪問數據庫,一般可以分為連接模式和非連接模式
    2012-03-03
  • 記錄asp.net網站是什么原因導致停止運行的代碼

    記錄asp.net網站是什么原因導致停止運行的代碼

    這篇文章主要介紹了記錄asp.net網站是什么原因導致停止運行的具體實現
    2014-03-03

最新評論

进贤县| 铁岭县| 毕节市| 会昌县| 习水县| 秭归县| 花莲市| 金昌市| 黔南| 郧西县| 大同市| 隆尧县| 青阳县| 观塘区| 商丘市| 镇远县| 边坝县| 利津县| 巨鹿县| 沈阳市| 富川| 桓仁| 界首市| 潜山县| 准格尔旗| 万载县| 肥乡县| 灵寿县| 广东省| 嘉祥县| 区。| 荆州市| 余江县| 拜城县| 密云县| 阿巴嘎旗| 保定市| 北川| 宜兴市| 沾化县| 胶州市|