java:文件上传与下载

一.文件上传

1.注意:

  • jsp提交方式必须为post

  • 必须采用复杂格式 : enctype=“multipart/form-data”

    <form action="/upload" method="post" enctype="multipart/form-data">
    
  • 需要commons-fileupload.jar来解析multipart/form-data格式,并且要依赖commons-io.jar

2.代码如下:

update.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<p> 姓名<input type="text" name="name"></p>
<p><input type="file" name="img"> ${requestScope.error}</p>
<p><input type="submit" value="提交"></p>
</form>
 </body>
</html>

UpdateServlet:

@WebServlet(urlPatterns = "/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //提前创建存储图片的目录
    new File("e:\\images").mkdirs();
    //将上传的文件存入服务器磁盘的一个工具类
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //核心文件上传工具类
    ServletFileUpload fileUpload = new ServletFileUpload(factory);
    fileUpload.setSizeMax(1024*1024); 
    try {
        //list对应表单的数据集合,其中每一项抽象为了FileItem(文本框,文件,复选框...)
        List<FileItem> list = fileUpload.parseRequest(req);
        //遍历集合
        for (FileItem item : list) {
            //如果是普通表单选项
            if(item.isFormField()){
                System.out.println("参数名:"+item.getFieldName());
                System.out.println("值:"+item.getString("UTF-8"));
            }else {
                //否则不是一个普通表单项,是一个文件
                System.out.println("得到文件长度:"+item.getSize());
                if(item.getSize()>0){
                    System.out.println("文件的原始名:"+item.getName());
                    item.write(new File("e:\\images\\"+item.getName()));
                }
                }
            System.out.println("===============================");
        }
    }
    catch (FileUploadBase.SizeLimitExceededException e) {
        req.setAttribute("error", "上传的文件超过了大小限制");
        req.getRequestDispatcher("/upload.jsp").forward(req, resp);
    }
    catch (FileUploadException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    }
}

二.文件下载

1.DownloadServlet代码:

@WebServlet(urlPatterns = "/download/*")
 public class DownloadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 1) 当响应的 content-type 设置为image,浏览器会显示图片
    resp.setContentType("image/jpg");

    // 2) 如果要把图片进行下载操作
    resp.setContentType("application/octet-stream");//二进制流,当不知道下载文件的类型是用
    //让浏览器默认下载而非展现这张图,并且以1.jpg的名字保存。
    resp.addHeader("content-disposition","attachment;filename=new.jpg");

    // 把【浏览器的路径】 转换为 【服务器的磁盘路径】
    String uri = req.getRequestURI(); // 获取浏览器实际输入路径
    System.out.println(uri);
    String path = "E:\\" + uri;// 图片的磁盘路径
    // 如果文件不存在,返回404
    if( !new File(path).exists() ) {
        resp.sendError(404);
       return;
    }
    // 如果存在,从文件输入流读取,向响应的输出流写
    FileInputStream is = new FileInputStream(path);
    OutputStream os = resp.getOutputStream();
    IOUtils.copy(is, os);
    IOUtils.closeQuietly(is);
}
}

2.注意:上述代码中有如下一段代码

// 2) 如果要把图片进行下载操作
    resp.setContentType("application/octet-stream");//二进制流,当不知道下载文件的类型是用
    //让浏览器默认下载而非展现这张图,并且以1.jpg的名字保存。
    resp.addHeader("content-disposition","attachment;filename=new.jpg");

二进流不知道文件类型时用application/octet-stream如下图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42689450/article/details/83151138