激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - Asp.net生成Excel文件并下載(更新:解決使用迅雷下載頁面而不是文件的問題)

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

2019-09-27 09:48asp.net開發網 ASP.NET教程

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

這里采用的是在服務端先生成Excel文件,然后利用文件地址下載的方法。 

生成Excel文件的方法,見:【原】.Net創建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的默認下載文件夾中。

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

在Firefox下

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

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

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

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

 

 

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

點擊確定后,被下載的文件又變成了實際文件(有時會先變成.zip文件,再變為實際文件)

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

在IE7下

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

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

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

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

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

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

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

懷疑迅雷是根據下載對話框中的網址重新請求下載,與發起請求的頁面已經無關,而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);//先在服務器端創建Excel文件。 
Response.Redirect(String.Format("{0}?Export={1}",Request.Path.ToString(),fileName));//重定向到本頁面,但Query參數變為Export。 

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(); 


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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人精品视频在线 | 3344永久免费 | 久久久久久久久国产精品 | 视频一区二区视频 | 青青草成人影视 | 黄免费在线观看 | 亚洲日本韩国在线观看 | 国产精品久久av | 色七七久久影院 | 97超视频在线观看 | 亚洲欧美日韩精品久久亚洲区 | 九九热精品在线视频 | 免费观看亚洲视频 | 亚洲成人在线视频网 | 国产精品国产三级国产aⅴ无密码 | 国产91久久久 | 夜间福利视频 | 精品国产一区二区三区在线 | 亚洲伊人色欲综合网 | 青草久久久久 | 亚洲综合无码一区二区 | 免费国产一区二区视频 | 伊人欧美 | 性爱视频在线免费 | 欧美亚洲国产成人综合在线 | 日本中文字幕高清 | h视频免费看 | 91精品国产乱码久久久久久久久 | 99欧美视频| 国产无遮挡裸体免费视频 | 日韩av在线播放一区 | 久久2019中文字幕 | 国产乱色精品成人免费视频 | 久久久三级免费电影 | 日韩欧美激情视频 | 精品免费久久 | 羞羞的视频在线免费观看 | 久久久成人动漫 | 九九精品在线播放 | av手机在线免费播放 | 奇米影视888狠狠狠777不卡 |