首先,加入Apache的commons-fileupload文件上传组件的相关jar包: commons-fileupload-xxx.jar Commons-io-xxx.jar
前端页面:
<body> <form action="${pageContext.request.contextPath}/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post"> 上传文件:<input type="file" name="file1"><br/> <input type="submit" value="提交"> </form></body>/**重点儿是给form表单增加enctype="multipart/form-data"属性*/后台处理:
public class UploadServlet extends HttpServlet{ public void doPost(HttpServletRequest request,HttpServletResponse response){ //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全 String realPath = this.getServletContext().getRealPath("/WEB-INF/upload"); File file = new File(realPath); if(!file.exists() || !file.isDirectory()){ System.out.PRintln(realPath+"该目录不存在,需要创建!"); file.mkdir();//创建目录 } //消息提示 String message = ""; //使用Apache文件上传组件处理文件上传 //1、创建一个DiskFileItemFactory对象工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //2、创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); //3、解决上传文件名的乱码问题 upload.setHeaderEncoding("UTF_8"); //4、判断提交上来的数据是否是上传文件表单的数据 if(!ServletFileUpload.isMultipartContent(request)){ System.out.println("请求不是格式不正确!"); 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"); //value = new String(value.getBytes("iso8859-1","utf-8")); System.out.println(name+"="+value); }else{//FileItem对象中封装的上传的文件 String filename = item.getName(); System.out.println("上传的文件名是:"+filename); //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:/a/b/1.txt,而有些只是单纯的文件名,如:1.txt //处理获取到的上传文件的文件名的路径部分,只保留文件名部分 filename = filename.subString(filename.lastIndexOf("//")+1); //获取item中的上传文件的输入流 InputStream in = item.getInputStream(); //创建一个字节文件输出流 OutputStream os = new FileOutputStream(realPath+"//"+filename); //创建一个字节输出缓冲区 byte[] buffer = new byte[1024]; 判断输入流中的数据是否已经读完的标识 int len = 0; //循环输入流中的数据读取到缓冲区中,(len=in.read(buffer))>0就表示in里面还有数据 while((len=in.read(buffer))>0){ //使用OutputStream输出流对象,将缓冲区的数据写入到指定的目录文件中 os.write(buffer,0,len); } //关闭流资源对象 in.close(); os.close(); //删除处理文件上传时生成的临时文件 item.delete(); message = "文件上传成功!"; } } response.setHeader("Content-type","text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); response.getWriter().write("文件上传成功!"); response.getWriter().flush(); }}新闻热点
疑难解答