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

下载文件:

 

 

posted @ 2021-09-22 14:18  Apak陈柏宇  阅读(37)  评论(0编辑  收藏  举报