1. 程式人生 > >C#檔案的上傳和下載

C#檔案的上傳和下載

檔案下載

//指定檔案MIME型別
Response.ContentType = "application/msword";
//下載頭指令
Response.AddHeader("Content-Disposition", "attchment;filename=c#基礎概念.doc");

//Response.WriteFile("files/1.doc");//將檔案直接寫入到http響應輸出流

//Response.Flush();//向客戶端傳送當前緩衝的所有輸出

//下載大檔案應該用流操作
Stream st = Response.OutputStream;//http響應輸出流(檔案的資料最初在伺服器端,最終寫入到st中)

FileStream fs = new FileStream(Server.MapPath("files/1.doc"), FileMode.Open, FileAccess.Read, FileShare.Read);

byte[] buffer=new byte[1024];
int count;//每次真正讀取到的位元組數
while((count=fs.Read(buffer,0,1024))>0)
{
//讀到資料(資料目前在緩衝區)
//把緩衝區裡面的資料寫入到st中
st.Write(buffer, 0, count);
//傳送資料
st.Flush();//清空緩衝區,把資料傳送到客戶端
}
fs.Flush();
fs.Close();
st.Close();

檔案上傳

//做檔案操作,form標記必須有enctype="multipart/form-data"屬性(ASP.NET會自動生成,但HTML控制元件必須手動新增)
HttpPostedFile hpf = FileUpload1.PostedFile;//獲取上傳的檔案
//獲取上傳檔案的大小
int len = hpf.ContentLength;//注意:以位元組為單位

string type = hpf.ContentType;//上傳檔案的MIME型別

string fileName = Path.GetFileName(hpf.FileName);
Response.Write("檔案大小:" + len + "<br/>" + "MIME型別:" + type + "<br/>" + "檔名:" + fileName);

//儲存路徑
//儲存檔案的全路徑不能重名,否則,後上傳的會覆蓋前面的
string path = "UpLoadFiles\\" + DateTime.Now.Ticks + fileName;
//開始上傳

//FileUpload1.SaveAs(Server.MapPath(path));//SaveAs 方法是一次性把檔案上傳到伺服器,不適合大檔案上傳,可能把伺服器卡死
//應該用流來上傳大檔案
Stream s = hpf.InputStream;//把檔案的資料讀取到st流中

//建立一個檔案流來把上傳的檔案寫入到伺服器上
FileStream fs = new FileStream(path,FileMode.Create,FileAccess.Write,FileShare.Read);
byte[] buffer=new byte[1024];//緩衝區
int readLen;//每次真正讀取到的位元組數
while ((readLen=s.Read(buffer, 0, 1024))>0)
{
//讀到資料了(此時獨到的資料在buffer緩衝區中)
//開始把檔案寫入到伺服器的磁碟中

fs.Write(buffer, 0, readLen);
}

fs.Flush();//請空緩衝區,使得所有緩衝區的資料都寫入到檔案中
s.Flush();
fs.Close();//關閉流,釋放資源
s.Close();

多檔案上傳

//獲取使用者傳送過來的檔案集合
HttpFileCollection hfc= Request.Files;
//多檔案上傳,還是要把檔案一個一個的寫入到伺服器磁碟
foreach (string fKey in hfc)
{
//迴圈遍歷所有檔案的集合,得到的是檔案對應的KEY,也就是"name"屬性
//Response.Write(fKey);
HttpPostedFile hpf= hfc[fKey];//根據key獲取對應的檔案

//只能上傳圖片(.jpg,.bmp,.png)
//注意:有的檔案上傳控制元件可能沒有選擇檔案
string type = Path.GetExtension(hpf.FileName).ToUpper();

string fileName = Path.GetFileName(hpf.FileName);

if (fileName=="")
{
Response.Write(fKey+"沒有上傳檔案");

}
else
{

if (type == ".JPG" || type == ".BMP" || type == ".PNG")
{

//設定儲存路徑
string path = Server.MapPath("UpLoadFiles\\" + DateTime.Now.Ticks + fileName);

Stream s = hpf.InputStream;//把檔案的資料讀取到st流中

//建立一個檔案流來把上傳的檔案寫入到伺服器上
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read);
byte[] buffer = new byte[1024];//緩衝區
int readLen;//每次真正讀取到的位元組數
while ((readLen = s.Read(buffer, 0, 1024)) > 0)
{
//讀到資料了(此時獨到的資料在buffer緩衝區中)
//開始把檔案寫入到伺服器的磁碟中

fs.Write(buffer, 0, readLen);
}

fs.Flush();//請空緩衝區,使得所有緩衝區的資料都寫入到檔案中
s.Flush();
fs.Close();//關閉流,釋放資源
s.Close();
Response.Write("上傳成功");
}
else
{
Response.Write(type + "不是圖片格式");
}

}