Day66 文件上传和下载

1.思维导图

2.代码部分

文件上传页面代码

<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
    描述:<input type="text" name="desc"><br>
    <input type="file" name="file"/><br>
    <button type="submit">上传</button>
</form>

文件上传后台代码

     //1,创建磁盘文件项工厂对象
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        //2,创建核心解析对象
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        try {
            //3,解析上传请求,获取文件项(包含上传的文件、描述文本)
            List<FileItem> fileItems = servletFileUpload.parseRequest(request);
            for (FileItem fileItem : fileItems) {
                //判断fileItem是否是一个上传文件
                if (fileItem.isFormField()) {
                    //是描述文本,打印文本
                    String desc = fileItem.getString();
                    System.out.println(desc);
                } else {
                    //是上传的文件
                    //获取到了上传的文件的输入流,包含了上传的文件的数据
                    InputStream inputStream = fileItem.getInputStream();
                    //转换成高效输入流
                    BufferedInputStream bis = new BufferedInputStream(inputStream);
                    //获取高效输出流
                    String dirPath = request.getRealPath("upload");
                    File dirFile = new File(dirPath);
                    if (!dirFile.exists()) {
                        //手动创建upload文件夹
                        dirFile.mkdir();
                    }
                    String path = dirPath + File.separator + fileItem.getName();
                    System.out.println(path);
                    FileOutputStream fos = new FileOutputStream(path);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    byte[] bys = new byte[8192];
                    int len = -1;
                    while ((len = bis.read(bys)) != -1) {
                        bos.write(bys,0,len);
                    }
                    bis.close();
                    bos.close();

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

文件名乱码问题解决

     //1,创建磁盘文件项工厂对象
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        //2,创建核心解析对象
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        //解决文件名称中文乱码问题
        servletFileUpload.setHeaderEncoding("utf-8");
        try {
            //3,解析上传请求,获取文件项(包含上传的文件、描述文本)
            List<FileItem> fileItems = servletFileUpload.parseRequest(request);
            for (FileItem fileItem : fileItems) {
                //判断fileItem是否是一个上传文件
                if (fileItem.isFormField()) {
                    //是描述文本,打印文本
                    String fieldName = fileItem.getFieldName();
                    System.out.println(fieldName);
                    String desc = fileItem.getString("utf-8");
                    System.out.println(desc);
                } else {
                    //是上传的文件
                    //获取到了上传的文件的输入流,包含了上传的文件的数据
                    InputStream inputStream = fileItem.getInputStream();
                    //转换成高效输入流
                    BufferedInputStream bis = new BufferedInputStream(inputStream);
                    //获取高效输出流
                    String dirPath = request.getRealPath("upload");
                    File dirFile = new File(dirPath);
                    if (!dirFile.exists()) {
                        //手动创建upload文件夹
                        dirFile.mkdir();
                    }
                    //文件名称 = 当前时间毫秒值 + 文件名称
                    String path = dirPath + File.separator + System.currentTimeMillis() + "-" + fileItem.getName();
                    System.out.println(path);
                    FileOutputStream fos = new FileOutputStream(path);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    byte[] bys = new byte[8192];
                    int len = -1;
                    while ((len = bis.read(bys)) != -1) {
                        bos.write(bys,0,len);
                    }
                    bis.close();
                    bos.close();

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

文件上传结合数据库后台代码

  • dao
 @Override
    public void addFile(MyFile file) throws Exception {
        new QueryRunner(JDBCUtils.getDataSource())
                .update("insert into tb_document(fileName,filePath,description) values(?,?,?)",
                        file.getFileName(),
                        file.getFilePath(),
                        file.getDesc());
    }
  • service
@Override
    public void addFile(MyFile myFile) throws Exception {
        FileDao userDao = new FileDaoImpl();
        userDao.addFile(myFile);
    }
  • controller
    //上传成功之后,把文件信息(id、文件名称、文件路径、描述)保存到数据库
    FileService userService = new FileServiceImpl();
    MyFile myFile = new MyFile();
    myFile.setFileName(fileName);
    // “/day66/upload/美女1.jpg” 绝对路径
    myFile.setFilePath(request.getContextPath() + File.separator + "upload" + File.separator + fileName);
    myFile.setDesc(desc);
    System.out.println(myFile);
    userService.addFile(myFile);

文件上传结合数据库页面代码

  • dao
@Override
public List<MyFile> selectFileList() throws Exception {
    return new QueryRunner(JDBCUtils.getDataSource())
            .query("select * from tb_document",
                    new BeanListHandler<MyFile>(MyFile.class));
}

 

  • service
  @Override
    public List<MyFile> selectFileList() throws Exception {
        FileDao userDao = new FileDaoImpl();
        return userDao.selectFileList();
    }

 

  • FileListServlet
     //获取上传文件列表
        FileService fileService = new FileServiceImpl();
        try {
            List<MyFile> fileList = fileService.selectFileList();
            request.setAttribute("fileList",fileList);
            //跳转到fileList.jsp
            request.getRequestDispatcher("/fileList.jsp").forward(request,response);
        } catch (Exception e) {
            e.printStackTrace();
        }

文件下载基本功能

     //获取下载文件名称
        String fileName = request.getParameter("fileName");
        System.out.println(fileName);
        //1,设置媒体类型 : 告诉浏览器下载的文件的类型
        //获取下载文件的媒体类型
        String mimeType = request.getServletContext().getMimeType(fileName);
        System.out.println(mimeType);
        response.setContentType(mimeType);
        //2,设置下载窗口,通过操作"Content-Disposition"
        response.setHeader("Content-Disposition","attachement;filename="+fileName);
        //3,开始io读写(完成下载功能)
        //服务器中的 1588737734261-美女2.jpg
        String path = request.getRealPath("upload") + File.separator + fileName;
        System.out.println(path);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
        ServletOutputStream outputStream = response.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(outputStream);
        byte[] bys = new byte[8192];
        int len = -1;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys,0,len);
        }
        bis.close();
        bos.close();

 

 下载文件中文乱码

  • 不同浏览器对文件名称的编码方式不同,所以需要区分不同的浏览器
     //获取下载文件名称
        String fileName = request.getParameter("fileName");
        System.out.println(fileName);
        //1,设置媒体类型 : 告诉浏览器下载的文件的类型
        //获取下载文件的媒体类型
        String mimeType = request.getServletContext().getMimeType(fileName);
        System.out.println(mimeType);
        response.setContentType(mimeType);


        //2,设置下载窗口,通过操作"Content-Disposition"
        //不同的浏览器对文件名称的编码方式不同,以Chrome浏览器为代表的是以utf-8对文件名称进行编码
        //其他的一些浏览器以base64对文件名称进行编码
        //判断使用的浏览器的类型User-Agent
        String userAgent = request.getHeader("User-Agent");
        String newFileName = null;
        if (userAgent.contains("Chrome")) {
            //以utf-8进行编码
            newFileName = URLEncoder.encode(fileName,"utf-8");
        } else {
            //以base64进行编码
            newFileName = base64EncodeFileName(fileName);
        }
        response.setHeader("Content-Disposition","attachement;filename="+newFileName);

        //3,开始io读写(完成下载功能)
        //服务器中的 1588737734261-美女2.jpg
        String path = request.getRealPath("upload") + File.separator + fileName;
        System.out.println(path);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
        ServletOutputStream outputStream = response.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(outputStream);
        byte[] bys = new byte[8192];
        int len = -1;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys,0,len);
        }
        bis.close();
        bos.close();

自定义文件上传

  • 发送端
        //获取本地文件对应的输入流
        String path = "C:\\Users\\qiuzhiwei\\Desktop\\aaa.txt";
        try {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
            Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),10241);
            BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
            byte[] bys = new byte[8192];
            int len = -1;
            while ((len = bis.read(bys)) != -1) {
                bos.write(bys,0,len);
            }
            bis.close();
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

 

  • 接收端
 try {
            //获取接收端的套接字
            ServerSocket serverSocket = new ServerSocket(10241);
            //相当于发送端的套接字
            Socket socket = serverSocket.accept();
            //获取对应的输入流,包含了发送端发送过来的数据
            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
            String destPath = "F:\\workspace\\day66\\out\\artifacts\\day66_war_exploded\\upload\\"+System.currentTimeMillis()+"-copy.txt";
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
            byte[] bys = new byte[8192];
            int len = -1;
            while ((len = bis.read(bys)) != -1) {
                bos.write(bys,0,len);
            }
            bis.close();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

自定义文件上传优化

 try {
            //获取接收端的套接字
            ServerSocket serverSocket = new ServerSocket(10241);
            while (true) {
                new Thread(){
                    @Override
                    public void run() {
                        //相当于发送端的套接字
                        Socket socket = null;
                        try {
                            socket = serverSocket.accept();
                            //获取对应的输入流,包含了发送端发送过来的数据
                            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
                            String destPath = "F:\\workspace\\day66\\out\\artifacts\\day66_war_exploded\\upload\\"+System.currentTimeMillis()+"-copy.txt";
                            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
                            byte[] bys = new byte[8192];
                            int len = -1;
                            while ((len = bis.read(bys)) != -1) {
                                bos.write(bys,0,len);
                            }
                            bis.close();
                            bos.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                }.start();

            }

        } catch (IOException e) {
            e.printStackTrace();
        }

 

posted @ 2020-05-06 21:37  Her4c  阅读(151)  评论(0编辑  收藏  举报