asp.net(c#)檔案下載實現代碼

來源:互聯網
上載者:User

複製代碼 代碼如下:using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e) { }
//TransmitFile實現下載
protected void Button1_Click(object sender, EventArgs e)
{
/* 微軟為Response對象提供了一個新的方法TransmitFile來解決使用Response.BinaryWrite 下載超過400mb的檔案時導致Aspnet_wp.exe進程回收而無法成功下載的問題。 代碼如下: */
Response.ContentType = "application/x-zip-compressed"; Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");
string filename = Server.MapPath("DownLoad/z.zip"); Response.TransmitFile(filename);
}
//WriteFile實現下載
protected void Button2_Click(object sender, EventArgs e)
{
/* using System.IO; */
string fileName = "asd.txt";//用戶端儲存的檔案名稱
string filePath = Server.MapPath("DownLoad/aaa.txt");//路徑
FileInfo fileInfo = new FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
Response.End();
}
//WriteFile分塊下載
protected void Button3_Click(object sender, EventArgs e)
{
string fileName = "aaa.txt";//用戶端儲存的檔案名稱
string filePath = Server.MapPath("DownLoad/aaa.txt");//路徑
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
if (fileInfo.Exists == true)
{
const long ChunkSize = 102400;//100K 每次讀取檔案,唯讀取100K,這樣可以緩解伺服器的壓力
byte[] buffer = new byte[ChunkSize];
Response.Clear();
System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
long dataLengthToRead = iStream.Length;//擷取下載的檔案總大小
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName)); while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//讀取的大小 Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
}
}
//流方式下載
protected void Button4_Click(object sender, EventArgs e)
{
string fileName = "aaa.txt";//用戶端儲存的檔案名稱
string filePath = Server.MapPath("DownLoad/aaa.txt");//路徑 //以字元流的形式下載檔案
FileStream fs = new FileStream(filePath, FileMode.Open);
byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length);
fs.Close();
Response.ContentType = "application/octet-stream"; //通知瀏覽器下載檔案而不是開啟 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}
}

/*
這裡提供4種常用下載方式 以供參考導讀:   
本文通過一個執行個體向大家介紹用C#進行Internet通訊編程的一些基本知識。我們知道.Net類包含了請求/響應層、應用協議層、傳輸層等層次。在本程式中,我們運用了位於請求/響應層的WebRequest類以及WebClient類等來實現高抽象程度的Internet通訊服務。本程式的功能是完成網路檔案的下載。   
實現原理
程式實現的原理比較簡單,主要用到了WebClient類和FileStream類。其中WebClient類處於System.Net名字空間中,該類的主要功能是提供向URI標識的資源發送資料和從URI標識的資源接收資料的公用方法。我們利用其中的DownloadFile()方法將網路檔案下載到本地。然後用FileStream類的執行個體對象以資料流的方式將檔案資料寫入本地檔案。這樣就完成了網路檔案的下載。   
實現步驟   
首先,開啟Visual Studio.Net,建立一個Visual C#Windows應用程式的工程,不妨命名為“MyGetCar”。接著,布置主介面。我們先往主表單上添加如下控制項:兩個標籤控制項、兩個文字框控制項、一個按鈕控制項以及一個狀態列控制項。
設定各控制項屬性如下:   
控制項類型 控制項名稱 屬性類型 屬性值 主表單 Form1 Text屬性 檔案下載器 標籤控制項 Label1 Text屬性 檔案地址: TextAlign屬性 MiddleRight Label2 Text屬性 另存到: TextAlign屬性 MiddleRight 文字框控制項 srcAddress Text屬性 (空) tarAddress Text屬性 (空) 按鈕控制項 Start FlatStyle屬性 Flat Text屬性 開始下載 狀態列控制項 StatusBar Text屬性 (空)   
其他屬性可為預設值,最終的主表單如所示:         
完成主表單的設計,我們接著完成代碼的編寫。   
在理解了基本原理的基礎上去完成代碼的編寫是相當容易。程式中我們主要用到的是WebClient類,不過在我們調用WebClient類的執行個體對象前,我們需要用WebRequest類的對象發出對統一資源識別項(URI)的請求。 複製代碼 代碼如下:try { WebRequest myre=WebRequest.Create(URLAddress); }
catch(WebException exp){
MessageBox.Show(exp.Message,"Error");
}

這是一個try-catch語句,try塊完成向URI的請求,catch塊則捕捉可能的異常並顯示異常資訊。其中的URLAddress為被請求的網路主機名稱。   在請求成功後,我們就可以運用WebClient類的執行個體對象中的DownloadFile()方法實現檔案的下載了。其函數原型如下:   public void DownloadFile( string address, string fileName);   其中,參數address為從中下載資料的 URI,fileName為要接收資料的本地檔案的名稱。   之後我們用OpenRead()方法來開啟一個可讀的流,該流完成從具有指定URI的資源下載資料的功能。其函數原型如下:   public Stream OpenRead(string address);   其中,參數address同上。   最後就是建立一個StreamReader對象從中讀取檔案的資料,並運用一個while迴圈體不斷讀取資料,只到讀完所有的資料。   
還有在使用以上方法時,你將可能需要處理以下幾種異常:   
● WebException:下載資料時發生錯誤。   
● UriFormatException:通過組合 BaseAddress、address 和 QueryString 所構成的 URI 無效。   
這部分的代碼如下:(client為WebClient對象,在本類的開頭處聲明即可) 複製代碼 代碼如下:statusBar.Text = "開始下載檔案...";
client.DownloadFile(URLAddress,fileName);
Stream str = client.OpenRead(URLAddress);
StreamReader reader = new StreamReader(str);
byte[] mbyte = new byte[100000];
int allmybyte = (int)mbyte.Length;
int startmbyte = 0;
statusBar.Text = "正在接收資料...";
while(allmybyte>0){
int m = str.Read(mbyte,startmbyte,allmybyte);
if(m==0)
break;
startmbyte+=m;
allmybyte-=m;
}

完成了檔案資料的讀取工作後,我們運用FileStream類的執行個體對象將這些資料寫入本地檔案中:
FileStream fstr = new FileStream(Path,FileMode.OpenOrCreate,FileAccess.Write); fstr.Write(mbyte,0,startmbyte);
*/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.