恩,如果不记下来,记忆就会模糊掉。

 

希望自己下次看见这篇博客的时候,会解决掉疑问

--------------------------------------------------------------------

<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.此过程发生在哪个阶段?

感谢着知识大爆炸的时代,感谢这人人共享的精神