图片的上传和下载
1. 先导包
2. 上传
<body> <%-- 文件上传的必要条件 : 1. 必须在form 表单中 , method = post 2.form 标签中的 encType = multipart/form-data 3.使用input type=file 选择上传的文件 4.servlet 接收文件 --%> < <form action="http://localhost:8080/JSP/uploadServlet" method="post" enctype="multipart/form-data"> 用户名: <input type="text" name="username"/><br> 头像 : <input type="file" name="photo"><br> <input type="submit" value="提交"> </form> </body>
public class UploadServlet extends HttpServlet { //文件上传 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求的字符编码 req.setCharacterEncoding("UTF-8"); //1. 先判断上传的数据是否是多段数据 ( 只有多段的数据 , 才是文件数据) if (ServletFileUpload.isMultipartContent(req)){ //2.创建用于解析数据的工具类 ServletFileUpload FileItemFactory fileItemFactory = new DiskFileItemFactory(); ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); try{ //3.解析上传的数据 , 得到每一个表单项 List<FileItem> list = servletFileUpload.parseRequest(req); //4.循环集合 , 判断是普通的数据 还是 文件类型 for (FileItem file : list) { if (file.isFormField()){ //普通数据 System.out.println("表单项的name属性 :"+file.getFieldName()); System.out.println("表单项的value属性 : "+file.getString("UTF-8")); }else{ //文件类型 System.out.println("表单项的name属性 :"+file.getFieldName()); //String fileName = URLEncoder.encode(file.getName(), "UTF-8"); System.out.println("上传的文件名 : "+file.getName()); //文件保存位置 file.write(new File("D:\\workspace\\idea\\javaWeb\\JSP\\web\\file\\"+file.getName())); } } }catch(Exception e){ e.printStackTrace(); } } } }
<servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.atguigu.servlet.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/uploadServlet</url-pattern> </servlet-mapping>
3.下载
public class DowmloadServlet extends HttpServlet { //文件下载 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获取要下载的文件名 String downloadFileName = "头像.jpg"; //2.读取要下载的文件内容 ( 通过 servletContext 对象读取) ServletContext servletContext = getServletContext(); //3.获取要下载的文件类型 String mimeType = servletContext.getMimeType("/file/" + downloadFileName); System.out.println("下载的文件类型 : "+mimeType); //4.在回传前 , 通过响应头告诉客户端返回的数据类型 resp.setContentType(mimeType); //5.告诉客户端 收到的数据是用于下载的 /* Content-Disposition : 表示收到的数据怎么处理 attachment : 附件 , 表示下载使用 filename: 指定文件名 没有处理中文乱码 : resp.setHeader("Content-Disposition","attachment;filename="+downloadFileName); */ //处理文件名的中文乱码问题 if (req.getHeader("User-Agent").contains("Firefox")) { // 如果是火狐浏览器使用Base64编码 resp.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" + new BASE64Encoder().encode(downloadFileName.getBytes("UTF-8")) + "?="); } else { // 如果不是火狐,是IE或谷歌,使用URL编码操作 resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downloadFileName, "UTF-8")); } //6.获取文件的输入流 InputStream inputStream = servletContext.getResourceAsStream("/file/" + downloadFileName); //7.获取相应的输出流 OutputStream outputStream = resp.getOutputStream(); //8.将输入流中的数据 , 复制到 输出流中 IOUtils.copy(inputStream,outputStream); } }
<servlet> <servlet-name>DownloadServlet</servlet-name> <servlet-class>com.atguigu.servlet.DowmloadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownloadServlet</servlet-name> <url-pattern>/downloadServlet</url-pattern> </servlet-mapping>