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(); }
@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);
@Override public List<MyFile> selectFileList() throws Exception { return new QueryRunner(JDBCUtils.getDataSource()) .query("select * from tb_document", new BeanListHandler<MyFile>(MyFile.class)); }
@Override public List<MyFile> selectFileList() throws Exception { FileDao userDao = new FileDaoImpl(); return userDao.selectFileList(); }
//获取上传文件列表 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(); }