恩,如果不記下來,記憶就會模糊掉。
希望自己下次看見這篇博客的時候,會解決掉疑問
--------------------------------------------------------------------
<form method="post" enctype="multipart/form-data" action="Upload.ashx" > <input type="file" name="fileName" /> <input type="submit" name="上傳" /> </form>
enctype屬性設置為multipart/form-data,瀏覽器會把上傳的文件名和文件數據放在結構體內,傳給Action中指向的文件中。
1.第一步,我們要首先獲取到,傳過來的結構體內的文件數據。
HttpPostedFile file=context.Request.Files[0];
因為這里我們設置只有一個file,只會傳一個文件。所以后面index中的值直接給0。
2.驗證用戶點擊上傳表單之后,file中是否為空
if (file.ContentLength > 0)
這里用的驗證是ContentLength 獲得傳遞Http傳遞的實體長度,file為空,則返回false
3.獲得用戶上傳文件的,文件名及拓展名。
//Path.GetFileName(path)以獲得文件名
//Path.GetExtension(path)獲得文件拓展名
string oldfileName = Path.GetFileName(file.FileName); //獲得文件名+拓展名 string fileExt = Path.GetExtension(oldfileName); //獲得拓展名
4.判斷用戶上傳的文件,是否為圖片。驗證后綴名
...省略
5.用Guid重寫用戶上傳的文件名
//使用Guid時,只需Guid.NewGuid()
string newFileName = Guid.NewGuid().ToString();
6.新建目錄,並判斷站點中是否含有此路徑,如沒有則新建
//Dicectory.Exists(Path)此方法用來確定,磁盤上是否具有相同路徑,返回Bool
//Directory.CreateDirectory(Path) 此方法用來生成目錄和子目錄。
string dir = "/UpLoad/" + DateTime.Now.Year + DateTime.Now.Month + DateTime.Now.Day; if (!Directory.Exists(context.Request.MapPath(dir))) { Directory.CreateDirectory(context.Request.MapPath(dir)); }
7.拼湊文件名-帶路徑。
string fullFileName = dir + newFileName + fileExt;
8.上傳文件
//SavsAs(完整文件名) 上傳文件。
file.SaveAs(context.Request.MapPath(fullFileName));
9.輸出
..略
------------------------------------------------------------------------------------------------------------------------------
留給自己的問題。
1.上傳一個文件,那么在瀏覽器內部發生了什么?Http協議怎么傳輸?
2.為什么enctype寫在action后不生效?
3.此過程發生在哪個階段?