JavaWeb复习----知识点5
javaweb知识点5之文件上传与下载:
上传:
首先在web.xml配置好我们的servlet程序:
<servlet> <servlet-name>uploadServlet</servlet-name> <servlet-class>文件上传.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>uploadServlet</servlet-name> <url-pattern>/uploadServlet</url-pattern> </servlet-mapping>
jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%-- 1.要有一个form标签,method = post请求 2.form标签的encType属性值必须是multipart/form-data值 3.在form标签中使用input type = file添加上传文件 4.编写服务器代码(Servlet程序)接收,处理上传的文件 --%> <form action="http://localhost:8080/demo/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> </html>
servlet程序:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //System.out.println("文件上传来了"); ServletInputStream inputStream = req.getInputStream(); //1.判断上传的数据是否是多段数据(只有是多段的数据,才是文件上传的) if(ServletFileUpload.isMultipartContent(req)) { //创建FileItemFactory工厂实现类 FileItemFactory fileItemFactory = new DiskFileItemFactory(); //创建用于解析上传数据的工具类ServletFileUpload ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); //解析上传的数据,得到每一个表单项FileItem try { //解析上传的数据,得到每一个表单项FileItem List<FileItem> list = servletFileUpload.parseRequest(req); //循环判断,每一个表单项,是普通类型,还是上传的文件 for(FileItem fileItem : list) { if(fileItem.isFormField()) { //普通表单项 System.out.println("表单项的name属性值: "+fileItem.getFieldName()); //参数utf-8,解决乱码问题 System.out.println("表单项的value属性值: "+fileItem.getString("UTF-8")); }else { //上传的文件 System.out.println("表单的name属性值:"+fileItem.getFieldName()); System.out.println("上传的文件名:"+fileItem.getName()); fileItem.write(new File("e:\\"+fileItem.getName())); } } } catch (Exception e) { e.printStackTrace(); } } }
示例:
点击上传后:
控制台输出:
表单项的name属性值: username 表单项的value属性值: 123456 表单的name属性值:photo 上传的文件名:1.png
文件最终保存在:
文件下载:
首先在web.xml中配置:
<servlet> <servlet-name>Download</servlet-name> <servlet-class>文件上传.Download</servlet-class> </servlet> <servlet-mapping> <servlet-name>Download</servlet-name> <url-pattern>/download</url-pattern> </servlet-mapping>
这里我就不些jsp页面(我太懒了)
sevlet程序:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获取要下载文件名 String downloadFileName = "image.jpg"; //2.读取要下载的文件内容(通过ServletContext对象可以读取) ServletContext servletContext = getServletContext(); //获取要下载的文件类型 //URL编码解决IE和谷歌浏览器的编码问题 String mimeType = servletContext.getMimeType("/file/" + URLEncoder.encode("中国.jpg","UTF-8")); //4.回传前通过响应头告诉客户端的数据类型 resp.setContentType(mimeType); //5.还要告诉客户端收到的数据时用于下载使用(还是响应头) //Content-Disposition表示收到的数据怎么处理 //attachment表示附件,表示下载使用 //filename表示指定下载的文件名 resp.setHeader("Content-Disposition","attachment; filename="+downloadFileName); //斜杠映射到代码的工程路径的webapp目录 InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName); //获取响应的输出流 OutputStream outputStream = resp.getOutputStream(); //3.把下载的内容回传给客户端 //读取输入流的内容并且复制给输出流,输出给客户端 IOUtils.copy(resourceAsStream,outputStream); }
我这里是直接根据网站链接下载image.jpg文件
输入如下网址并进入后:
http://localhost:8080/demo/uploadServlet
下载文件: