javaweb文件上传原理

来源:互联网 发布:易辅客栈模块源码 编辑:程序博客网 时间:2024/05/21 21:40

解决上传中文乱码问题-上传文件安全问题-上传文件被覆盖的问题-UUID算法

注意:

在HTML页面
input  必须有 name

<input type="file" name="filename">

表单如果包含一个文件上传输入项的话,这个表单的enctype属性就必须设

置为multipart/form-data

<form action ="/day16/servlet/UpLoadServlet"

enctype="multipart/form-data" method="post">

浏览器表单的类型如果为multipart/form-data,那么浏览器在提交表单数据

时,它将采用MIME协议对数据进行封装后提交,在服务器这端也将不能采用

原来传统的方工获取数据了。

在服务器端想获取数据就要通过流。
request提供了一个getInputStream读取流。


为了方便用户处理文件上传数据,Apache开源组织提供了一个用来处理表单

文件上传的一个开源组件(Commons-fileupload).

使用Commons-fileupload组件实现文件上传,需要导入该组件相应的jar包.
Commons-fileupload和commons-io两个jar包.

DiskFileItemFactory是创建FileItem对象的工厂包括方法:

1.public void setSizeThreshold(int?sizeThreshold) 
设置内存缓冲区的大小,默认值为10K,如果文件大于10K,将使用临时文件缓

存上传文件.

2.public void setRepository(java.io.File repository)
指定临时文件目录

3.public DiskFileItemFactory();

 

ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成

一个FileItem对象中.

常用方法:

1.boolean isMultipartContent(HttpservletRequest request)
判断上传表单是否为上传表单类型

2.List parseRequest(HttpServletRequest request)
对requests对象进行解析,并把表单中的每一个输入项包装成一个fileItem

对象,并返回一个保存了所有FileItem的list集合.

3.setFileSizeMax(long fileSizeMax)设置上传文件最大值

4.setSizeMax(long sizeMax)设置上传文件总量的最大值

5.setHeaderEncoding()设置编码格式


实例:


public class UploadServlet extends HttpServlet{


DiskFileItemFactory factory=new DiskFileItemFactory();

ServletFileUpload upload=new ServletFileUpload(factory);

判断提交表单的类型是否为multipart/form-data

if(!upload.isMultipartContent(request))
{
return;
}

try
{
List list=upload.parseRequest(request);
Iterator it=list.iterator();

while(it.hasNext())
{
FileItem item=(FileItem)it.next();//每一个item就代表一个表单输出项

if(item.isFormField())//判断input是否为普通表单输入项,就是判断一个参数域是普通的表单输入域,还是文件上传域,如果该方法返回真的话,则是前 者,如果为假,则是后者。是后者的情况下,就要对相应的域做相应的文件上传处理。

String name=item.getFieldName();input的名称

String value= item.getString();input的值
}else{

得到上传文件的名称,并截取
String filename=item.getName();

得到上传文件要写入的目录
String path=this.getServletContext().getRealPath("/upload");  //   一个servlet可以使用getServletContext()方法得到web应用servletContext  
                                                                             //  即而使用getServletContext的一些方法来获得一些值  
                                                                             //   比如说getServletContext().getRealPath("/")来获得系统绝对路径  
                                                                             //getServletContext().getResource("WEB-INF/config.xml")来获得xml文件的内                                                                              //根据目录和文件创建输出流

FileOutputStream out=new FileOutputStream(path+filename);

InputStream in = item.getInputStream();
 byte buffer[] = new byte[1024];
 int len = 0;
while((len=in.read(buffer))>0){
 out.write(buffer,0,len);
   }
in.close();
out.close();
 }
}
} catch (FileUploadException e) 
{
e.printStackTrace();
  }
 }

}

同学问题:

什么时候用/  什么时候用/

老师解答;

/:表示url地址,例如http://loacalhost:8080/

request.getRequestDispacher("/");

/:表示路径,例如:c:/windows/

new FileOutputStream("c://1.txt");

要JAVA语言里面,"/"代表转义.


解决上传中文乱码问题 
可以通过
upload.setHeaderEncoding("utf-8");

上传文件时不安全应用举例
Runtime.getRuntime.exec("")
可以执行DOS命令.

1.上传文件怎么保证服务器的安全?

解决方案:上传目录要禁止外界直接访问,一般的做法是把上传目录放到服务

器的WEB-INF目录下.这个目录服务器是保护的,外界无法访问.


2.上传文件被覆盖的问题

服务器要为每一个上传文件生成一个唯一的文件名.

可以使用UUID算法.

3.上传的文件需要打散

 

经典面试题

算法  一个数异或两次,得到是数据本身.
x=1;
y=2;

x=x^y;
y=x^y;
x=x^y;

异或经常用来加密

 

 

临时文件的删除

FileItemDelete

删除临时文件一定要在流关闭之后,否则会出现文件占用,而导致删除失败.

 


多文件上传问题:
主要是javascript编码,在页面动态添加文件上传项.

监听上传进度:

自己写一个监听器progressListener

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我怎么办微信把拉黑一次删了人太多 国家大剧院的票丢了能补票吗怎么办 打完狂犬疫苗后我抽了很多烟怎么办 我老婆接受了我的小三现在该怎么办 今日头条我发的文章浏览量少怎么办 如果荷兰猪母的和公的打架该怎么办 我买的商铺地址被别人注册了怎么办 搜狗阅读购买搜豆没有到账该怎么办 捡的ⅴⅰⅴo指纹屏锁解不开怎么办 在百度上订的演出票不配送了怎么办 我在租车公司租的车撞报废了怎么办 交给学校查重的论文发错了怎么办啊 顺丰快递员把我的快递弄丢了怎么办 苹果6换了电池触屏不好用了怎么办 律协以律所被投诉不批准实习怎么办 提车时间没有写4s不给车怎么办 全店的人都知道我坐过牢怎么办 找了一个长得帅玩心重的老公怎么办 汽车左后轮油封漏油换了也漏怎么办 星露谷物语不小心把任务删了怎么办 饿了么商家版账号和密码忘了怎么办 红米4x手机里的照片全删了怎么办 微信表情包里编辑软文的数字怎么办 在转转上卖东西下单了想取消怎么办 丈夫的前儿子偷了我的钱我该怎么办 从日本寄的邮包被海关扣下了怎么办 卖家要求退货寄过去的货坏了怎么办 寄快递发货单丢了货发出去了怎么办 酷派手机电源键坏了开不了机怎么办 红米4a进水后开机就黑屏了怎么办 红米1s进水后开机了黑屏了怎么办 魅族手机已锁定魅族账号忘了怎么办 魅族5糸统升级后开不了机了怎么办 如果别人用电脑登了你的微信怎么办 消逝的光芒买错了买的普通版怎么办 在人人车卖了个车买家不过户怎么办 应用锁密码和密保问题都忘了怎么办 不小心在微信公众号发了消息怎么办 微信漂流瓶不能用了被投诉了怎么办 货物少了拉货的不承认少了怎么办 寄的快递号码留错了已经寄走怎么办