
正文
利用apache组件实现文件上传
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
实现文件上传需要引入:
- commons-fileupload-1.3.2.jar
- commons-io-2.5.jar
- commons-logging-1.2.jar
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload" method="post" enctype= "multipart/form-data">
<input type="text" name="username"/><br/>
<input type="password" name="passwd" ><br/>
<input type="file" name="file"> <br/>
<input type="submit">
</form>
</body>
</html>
-
enctype= "multipart/form-data" 是实现文件上传必不可缺少的属性,但是加了此属性之后,就不能以 request.getParameter(arg0); 来获取表单值,只能通过getFieldName()获取表单名,getString()获取表单值。
if(items.isFormField()){
if("des".equals(items.getFieldName())){
fileDesc1=new String(items.getString().getBytes("iso-8859-1"),"UTF-8");
}
-
用户上传文件之后,通过表单的action属性发送到相应的servlet进行处理,我们在得到用户提交的数据之后,把用户数据分为两种: 1.普通文本数据 2.文件 对于文件数据我们要进行特别的处理才能正常使用。
-
我们通过创建磁盘文件工厂的对象DiskFileItemFactory来设置文件的临界值(超过这个临界值就需要通过临时文件来作为缓冲)和临时目录以及上传文件保存目录等等。
DiskFileItemFactory diff=new DiskFileItemFactory();
diff.setSizeThreshold(10*1024*1024);
diff.setRepository(new File(this.getServletContext().getRealPath("tmp")));
2. 然后设置文件上传对象ServletFileUpload,并把文件工厂的对象添加进来。
ServletFileUpload sfu=new ServletFileUpload(diff);
3. 接下来我们需要对文件进行解析。fileUpload.parseRequest()用于解析文件请求,并返回一个List<FileItem>类。FileItem类用来封装单个表单字段元素的数据,一个表单元素对应一个对象(表单元素是允许用户在表单中(比如:文本域,下拉列表,单选框,复选框等等)输入信息的元素)。
List<FileItem> item=null;
try {
item=fileUpload.parseRequest(request);
for(FileItem items:item){
if(items.isFormField()){ //为普通表单
if("des".equals(items.getFieldName())){ //表单
fileDesc1=new String(items.getString().getBytes("iso-8859-1"),"UTF-8");
}
}else{ //为表单中的文件
String uppath=this.getServletContext().getRealPath("upload"); //获得上传文件夹路径
FileOutputStream fos=new FileOutputStream(uppath+"/"+items.getName()); //文件输出流,流向文件而不是文件夹
fileDesc=items.getName();
if(items.isInMemory()){ //小于10M,直接写到上传文件夹
fos.write(items.get()); //往流里写内容,流入文件
}else{ //大于10M,先上传到临时文件夹tmp中
IOUtils.copy(items.getInputStream(), fos); //将输入流的内容复制到输出流,流入文件
}
fos.close();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}








