注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

ServletFileUpload-解决上传中文乱码问题  

2015-02-26 16:33:18|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
传智播客JAVA就业班学习笔记-文件上传和下载-ServletFileUpload-解决上传中文乱码问题-上传文件安全问题-上传文件被覆盖的问题-UUID算法

2010-03-30 23:19:30|? 分类: JAVA学习笔记 |? 标签: |举报 |字号大中小 订阅

3月1号传智播客JAVA就业班学习笔记

java web 第十六天笔记

讲课老师 方立勋

文件上传和下载

注意:

在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");
根据目录和文件创建输出流

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

  评论这张
 
阅读(366)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017