文件上传

稍微复杂一些  直接使用Servlet实现有难度,一般使用apache commons组件中commons-fileUpload组件,大大降低操作的难度。

commons-fileUpload离不开commons-io组件

commons-fileUpload的常用类

FileItemFactory    DiskFileItemFactory:工厂类,生产FileItem

FileItem:每个表单项都会被封装成一个FileItem对象

ServletFileUpload:实现上传操作,将表单数据封装到FileItem中

第一节 文件上传的实现

@WebServlet("/servlet/FileUpLoad")
public class FileUpLoad extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
       //【A】创建文件上传的工厂对象
        FileItemFactory  factory=new DiskFileItemFactory();

        //【B】获得文件上传的组件对象
        ServletFileUpload  upload=new ServletFileUpload(factory);

        //设置文件上传的编码
        upload.setHeaderEncoding("utf-8");
        try {
            //【C】 获得前台所有的表单数据
            List<FileItem> list = upload.parseRequest(req);


            String name="";

            int  age=0;

            int score=0;

            String  filename="";

            String filetype="";

            for(FileItem  item : list){

                //System.out.println(item.getFieldName()+"--"+item.getSize()+"--"+item.getName()+"--"+item.getContentType()+"--"+item.isFormField());

                if(!item.isFormField()){
                    //证明是文件表单
                    filetype=item.getContentType();

                    String subString = item.getName().substring(item.getName().lastIndexOf("."));

                    /******【F】设置上传文件的类型  .jpg  .png  .gif */

                    if(!(".jpg".equals(subString)||".png".equals(subString)||".gif".equals(subString))){

                        req.setAttribute("msg","上传文件的类型必须是图片");
                        req.getRequestDispatcher("/add.jsp").forward(req,resp);
                        return;

                    }
                    /*****【E】指定上传文件的大小*******/
                    if(item.getSize()>20*1024){

                        req.setAttribute("msg","文件最大为20k");
                        req.getRequestDispatcher("/add.jsp").forward(req,resp);
                        return;
                    }

                    /****【D】使用UUID保证文件不重复**********/
                    String uuid = UUID.randomUUID().toString();

                    // 1.jpg   1.1.jpg   .jpg

                      filename=uuid+subString;

                    //文件的上传
                    /***【C】动态获得服务器目录*/

                    String realPath = req.getServletContext().getRealPath("/imgs");

                    System.out.println(realPath);


                    /****【B】创建文件夹*****/

                    File  file=new File(realPath);
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    item.write(new File(file,filename));

                }else{
                    //文本表单项

                    if("name".equals(item.getFieldName())){

                         name = item.getString("utf-8");
                    }

                    if("age".equals(item.getFieldName())){

                         age = Integer.parseInt(item.getString());
                    }

                    if("score".equals(item.getFieldName())){

                          score =Integer.parseInt(item.getString());
                    }
                    
                }

            }


            Student  student=new Student(0,  name,  age,  score,  filename,  filetype);
            //执行添加的操作
            StudentService  studentService=new StudentServiceImpl();
            int i = studentService.add(student);
            if(i>0){
                resp.sendRedirect(req.getContextPath()+"/show2.jsp");
            }else {
                req.setAttribute("msg","注册失败");
                req.getRequestDispatcher("/add.jsp").forward(req,resp);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
/**
 *   遇到的问题:
 *   1、文件上传的时候名字中文乱码: o
 *     A、 req.setCharacterEncoding("utf-8");
 *     B、 upload.setHeaderEncoding("utf-8");
 *   2、上传的文件夹名称必须给出:
 *      file.exists()
 *   3、上传不到当前服务器的路径中:
 *     String realPath = req.getServletContext().getRealPath("/imgs");
 *   4、相同的图片名称会覆盖
 *     String uuid = UUID.randomUUID().toString();
 *   5、无法指定上传文件的大小:
 *        A、upload.setSizeMax(20);
 *        B、item.getSize()>20*102
 *   6、无法指定上传文件的类型 :
 *     ".jpg".equals(subString)

  

第三节 文件下载实现

@WebServlet("/servlet/FileDownLoad")
public class FileDownLoad extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String realPath = req.getServletContext().getRealPath("/imgs");
        String filename = req.getParameter("filename");

        File  file=new File(realPath+"/"+filename);
        //[A]从服务器中把指定的文件读过来
        InputStream  input=new FileInputStream(file);
        //设置下载文本的长度
        resp.setContentLength((int) file.length());
        //设置文本的类型
        resp.setContentType(req.getParameter("filetype"));
 resp.setHeader("Content-Disposition","attachment;filename="+filename);
        //[B]把读过来的文件写到本地
        OutputStream  output=resp.getOutputStream();
        IOUtils.copy(input,output);
        output.close();
        input.close();
    }}

  

posted @ 2021-01-18 15:42  巧克力曲奇  阅读(81)  评论(0编辑  收藏  举报