用servlet的upload功能实现文件上传很繁琐,代码量很大。可以用fileupload library组件实现文件上传,具体操作步骤如下:
1. 下载相关组件(commons-fileupload-xxx.jar及commons-io-xxx.jar)并copy 到项目的WEB-INF/lib 目录下,完成组件的引用;
代码如下:
try{
DiskFileItemFactory factory=new DiskFileItemFactory(); //创建一个DiskFileItemFactory工厂
ServletFileUpload upload=new ServletFileUpload(factory); //创建一个文件上传解析器
upload.setHeaderEncoding("UTF-8"); //解决上传文件名中文乱码问题
//判断上传的数据是否上传表单数据,如果不是则不做处理
if(!ServletFileUpload.isMultipartContent(request)) {
return;
}
//利用ServletFileUpload解析上传数据,解析结果返回的是List<FileItem>
List<FileItem> list=upload.parseRequest<request>;
for(FileItem item:List){
//如果FileItem中封装的是普通入项数据,
if(Item.isFormField()){
String name=item.getFieldName();
String value=item.getString("UTF-8");
}
else {
//如果FileItem中封装的是上传文件内容
//得到上传文件名
String filename=item.getName();
if(filename==null || filename.trim().equals("")) {
continue;
}
//如果有些浏览器上传的文件名中带有路径,则截取路径,只保留文件名
filename=filename.substring(filename.lostIndexof("\\")+1);
InputStream in=item.getInputStream(); //获取item中的上传文件输入流
FileOutputStream out=new FileOutputStream(file); //创建一个文件输出流
byte buffer[]=new byte[1024]; //创建一个缓冲区
//用一个变量标记输入流中的数据是否已经读完
int len=0;
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();
//关闭上传产生的临时文件
item.delete();
message="upload ok";
}
}
}catch (Exception e){
message="uplaod failure";
e.printStackTrace();
}
response.getWriter().append(message);