无为_无趣

JavaEE文件上传下载功能的实现

文件上传下载步骤:

  1. 导入所用到的jar包:commons-fileupload.jar    commons-io.jar。在视图层中的form表单中修改method = “post” ,添加enctype="mulipart/form-data" 属性;文件:<input type = "file" name = "uploadFile">
  2.  在Servlet中接受从表单项传递过来的数据;

  3. (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")
             * */    

 

posted on 2020-06-04 16:58  无为_无趣  阅读(416)  评论(0)    收藏  举报

导航