最近做項目時總是用到上傳下載功能,網上搜了一下,這種功能很簡單,所以沒有把它當作一個難點,沒想到後來經常碰到文件資源被佔用的問題,文件“。。。。。。\Download\20142m10d417991a346.docx”正由另一進程使用,因此該進程無法訪問此文件。下載代碼如下:
protected void BtnTextLoad_Clik(string filePath, string fileName)
{
if (filePath != "" && fileName != "")
{
string a = Server.MapPath(filePath);//路徑
// string fileNames = fileName + a.Substring(a.LastIndexOf("."), a.Length - a.LastIndexOf("."));
string filepath = a.Substring(0, a.LastIndexOf("view")) + filePath;
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(); }
}
else
{
Response.Write("<script type=\"text/javascript\">alert(\"下載的文件不存在!\");\"</script> ");
}
查看代碼,明明已經有Response.Close();來結束響應了。後來經過查找資料,發現還需關閉剛剛創建的iStream,即在Response.Close後面添加上iStream.Close().這麼一個細節,花費了我近一天的時間。
iStream