首页 > 代码库 > 006-文件上传校验与直接下载

006-文件上传校验与直接下载

-》说明:使用http协议只适合传输小文件,如果想传递大文件,则需要使用插件或者客户端程序(使用ftp协议)
-》客户端操作
《1》为表单添加属性:enctype="multipart/form-data"
《2》在表单中添加控件:<input type="file" name="f1"/>
《3》表单必须使用post提交方式
-》服务器端操作
《1》使用Request.Files属性获取文件对象
《2》使用HttpPostedFile对象的SaveAs()方法保存
-》观察一下数据报文
当设置表单的enctype="multipart/form-data"属性后,不再是key-value格式,而是在请求体中使用分隔符划分
-》限制:不允许上传可执行文件,只允许上传静态文件
例:只允许上传图片
客户端校验
服务器端校验
-》提高:将文件保存到对应年、月、日文件夹下,以方便遍历
动态创建路径
拼接路径信息

文件上传校验

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 5     <title></title>
 6     <script>
 7         window.onload = function() {
 8             document.getElementById(form1).onsubmit = function ()
 9             {
10                 //var f1= document.getElementById(‘f1‘);
11                 //var ext = f1.value.substring(f1.value.lastIndexOf(‘.‘));
12                 //if (ext == ‘.jpg‘) {
13                 //    return true;
14                 //} else {
15                 //    alert(‘文件格式非法‘);
16                 //    return false;
17                 //}
18             };
19         };
20     </script>
21 </head>
22 <body>
23     <form method="POST" action="UploadTest.ashx" enctype="multipart/form-data" id="form1">
24         <input type="text" name="fileName"/>
25         <br/>
26         <input type="file" name="f1" id="f1"/>
27         <input type="submit" value="上传"/>
28     </form>
29 </body>
30 </html>
 1         public void ProcessRequest(HttpContext context)
 2         {
 3             //文本格式text/html
 4             context.Response.ContentType = "text/html";
 5             //获取文件名
 6             string fileName = context.Request["fileName"];
 7             //根据键接收文件
 8             HttpPostedFile file1 = context.Request.Files["f1"];
 9             //获取文件扩展名(IE浏览器获取绝对全路径)
10             string ext = Path.GetExtension(file1.FileName);
11             if (ext != ".jpg")
12             {
13                 context.Response.Write("文件格式非法");
14                 return;
15             }
16             //绝对路径
17             string path = context.Request.MapPath("/Uploads/");
18             //相对路径
19             string path2 = "/uploads/";
20             //向特定文件夹中进行保存
21             DateTime now = DateTime.Now;
22             path += now.Year + "/" + now.Month + "/" + now.Day + "/";
23             path2 += now.Year + "/" + now.Month + "/" + now.Day + "/";
24             //判断是否存在
25             if (!Directory.Exists(path))
26             {
27                 //没有则创建
28                 Directory.CreateDirectory(path);
29             }
30             //保存(路径+文件名+扩展名)
31             file1.SaveAs(path+fileName+ext);
32             //显示
33             context.Response.Write("<img src=http://www.mamicode.com/‘"+path2+fileName+ext+"‘/>");
34         }

文件直接下载

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 5     <title></title>
 6 </head>
 7 <body>
 8     <a href="Uploads/redgreen.rar">Uploads/redgreen.rar</a>
 9     <a href="Uploads/redgreen.swf">Uploads/redgreen.swf</a>
10     <a href="Uploads/sg1.jpg">show girl</a>
11     <hr/>
12     <a href="/DownloadTest.ashx?f1=Uploads/redgreen.rar">Uploads/redgreen.rar</a>
13     <a href="/DownloadTest.ashx?f1=Uploads/redgreen.swf">Uploads/redgreen.swf</a>
14     <a href="/DownloadTest.ashx?f1=Uploads/sg1.jpg">show girl</a>
15 </body>
16 </html>
 1         public void ProcessRequest(HttpContext context)
 2         {
 3             string f1 = context.Request["f1"];
 4             //指定为下载操作
 5             context.Response.ContentType = "application/octet-stream";
 6             //附加头信息,表示保存文件时的文件名
 7             context.Response.AddHeader("Content-Disposition", "attachment; filename=\""+f1+"\";");
 8             //输出文件
 9             context.Response.WriteFile(context.Request.MapPath(f1));
10         }

 

006-文件上传校验与直接下载