JavaWeb实现文件的上传
文件上传的前提
1、提供form表单,method必须是post
2、form表单的enctype必须是multipart/form-data
3、提供input type="file"类的上传输入域
在Web开发系统应用中,文件上传一般采用apache的开源工具common-fileupload文件上传组件
1,导入commons-fileupload相关jar包:
2.fileupload的核心类有:
DiskFileItemFactory、ServletFileUpload、FileItem。
3,解析原理:
使用Apache文件上传组件处理文件上传,步骤如下: 2.1 创建一个创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); 2.2 创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); 2.3 解决上传文件名的中文乱码 upload.setHeaderEncoding("UTF-8"); 2.4 使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 List<FileItem> list = upload.parseRequest(request); 2.5 创建一个Map集合用于封装表单项的数据 Map<String,String> map = new HashMap<String, String>(); 2.6 迭代FileItem表单项 for(FileItem item : list){ 2.6.1 //如果FileItem中封装的是普通表单项 if(item.isFormField()){ //获取表单项的字段名(name属性) String name = item.getFieldName(); //得到字段值,并解决中文乱码问题 String value = item.getString("UTF-8"); //向Map中赋值 map.put(name,value); } 2.6.2 //如果FileItem中封装的是文件表单项 else{ //得到长传的文件名称 String filename = fileItem.getName(); /*处理文件名,去除上传文件名的路径部分,只保留文件部分 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt, 而有些只是单纯的文件名,如:1.txt*/ if(filename!=null){ filename = FilenameUtils.getName(filename); } //获取文件的类型 String extension = FilenameUtils.getExtension(filename); //限制上传文件的类型不能是jsp和exe类型 if(!("jsp".equals(extension) || "exe".equals(extension))){ //文件上传 fileItem.write(new File(storeDirectory,filename)); //删除临时文件 fileItem.delete(); } //将文件表单项的name和value保存到map中 map.put(fileItem.getFieldName(),filename); } } }