图片的上传和下载

 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>
原文地址:https://www.cnblogs.com/Anonymity-zhang/p/14690609.html