JavaEE文件上传下载功能的实现
文件上传下载步骤:
- 导入所用到的jar包:commons-fileupload.jar commons-io.jar。在视图层中的form表单中修改method = “post” ,添加enctype="mulipart/form-data" 属性;文件:<input type = "file" name = "uploadFile">
-
在Servlet中接受从表单项传递过来的数据;
(1)创建FileItemFactory对象;
- (2)创建ServletFileUpload对象;
- (3)通过ServletFileUpload对象实现上传操作,用ServletFileUpload对象的parseRequest()方法将表单项中的信息封装到FileItem中;
- (4)遍历FileItem,选择出文件表单项;
- 如果是文件表单项在对文件表单项进行操作;
//1.创建FileItemFactory对象 FileItemFactory factory = new DiskFileItemFactory(); //2.创建ServletFileUpload兑现 ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("utf-8"); // jiejue 表单项乱码问题 upload.setFileSizeMax(16*1024*1024);//单个文件上传的大小 upload.setSizeMax(5*16*1024*1024); // 所有文件上传的大小 //3.通过ServletFileUpload对象实现上传操作,将客户端一个个表单项封装到一个个FileItem中 List<FileItem> itemList = null; try { itemList = upload.parseRequest(request); } catch (FileUploadException e) { e.printStackTrace(); request.setAttribute("mess", "文件大小为16*1024*1024"); request.getRequestDispatcher("/add.jsp").forward(request, response); return; } //4.遍历各个File Item(相当于各个表单项进行处理) System.out.println(itemList.size()); String name = null; int age = 0; double score = 0; String realName = null; String photoName = null; String photoType = null; for(int i=0;i<itemList.size();i++){ //取出第i个表单项 FileItem item = itemList.get(i); String fieldName = item.getFieldName();//获取name属性 //判断普通表单项还是文件表单项 if(item.isFormField()){//普通,获取从客户端传递过来的值 if("name".equals(fieldName)){ name = item.getString("utf-8");//汉字需要修改编码 } if("age".equals(fieldName)){ age = Integer.parseInt(item.getString()); } if("score".equals(fieldName)){ score = Double.parseDouble(item.getString()); } }else{//文件表单项 //客户端传的文件表单项是photo,如果是多个可以使用多个if if("photo".equals(fieldName)){ //只能上传指定格式的文件 photoType = item.getContentType();//值为:images/jpg if(!"image/jpeg".equals(photoType)&&!"image/gif".equals(photoType)){ request.setAttribute("mess", "上传格式不正确"); request.getRequestDispatcher("/add.jsp").forward(request, response); return; } //获取文件路径 String realPath = this.getServletContext().getRealPath("/upload"); File dir = new File(realPath); if(!dir.exists()){ dir.mkdirs(); } //指定上传的文件夹和文件名 realName = item.getName(); //指定长传的文件夹和文件名 //完善2:为了防止文件的同名覆盖,上传到服务器端的文件重新命名 UUID uuid = UUID.randomUUID(); String extName = realName.substring(realName.lastIndexOf(".")); photoName = uuid.toString()+extName; File file = new File(dir,photoName); try { item.write(file); } catch (Exception e) { e.printStackTrace(); } } } }
FileItem 常用类:
FileItem item = itemList.get(i); //熟悉FileItem的主要方法 item.isFormField(); //是否是file表单项 是file false 不是file true item.getFieldName();//表单项的name属性的值 item.getString();//对于非file表单项,value属性的值;对于file表单项,是文件内容 item.getString("utf-8");//解决非file表单项的中文乱码问题 比如name item.getName();//对于file表单项,上传文件的名称;对于非file表单项,返回null item.getContentType();//对于file表单项,上传文件mime类型 ;对于非file表单项,返回null item.getSize();//对于file表单项,上传文件的大小 ;对于非file表单项,value值的宽度
下载:通过I/O 流实现从服务器端下载到客户端
//1.获取客户端响应 int ID = Integer.parseInt(request.getParameter("id")); //2.调用业务层处理数据 StudentService st = new StudentServiceImpl(); Student stu = st.findById(ID); //3.通过I/O流实现下载操作(从服务器端下载到客户端) //3.1创建一个输入流和输出流 String realPath = this.getServletContext().getRealPath("/upload"); String fileName = realPath + "/" +stu.getPhotoName(); File file = new File(fileName); response.setContentLength((int) file.length()); response.setContentType(stu.getPhotoType()); //response.setHeader("Content-disposition", "inline");//!!!! attachment //判断浏览器 String realName = stu.getRealName(); String userAgent = request.getHeader("User-Agent").toLowerCase(); if(userAgent.indexOf("msie")>=0){ realName = URLEncoder.encode(realName, "utf-8"); //IE }else{ realName = new String(realName.getBytes("utf-8"),"iso-8859-1");//谷歌 } response.setHeader("Content-disposition", "attachment;filename="+realName); InputStream is = new FileInputStream(file); OutputStream os = response.getOutputStream(); //3.2使用输入流和输出流完成复制操作 IOUtils.copy(is, os); //3.3关闭流 is.close(); os.close(); /* * 表单提交post和get方式处理数据乱码问题 * req.setCharacterEncoding("utf-8");post * * get 方式 * String name = req.getParameter("name"); * byte [] bytes = name.getBytes("iso-8859-1"); * name = new String(bytes,"utf-8"); * * name = new String(name.getBytes("iso-8859-1"),"utf-8") * */