servlet3 upload上传文件实践

一、javax.servlet.http中Part接口

public interface Part
要上传文件必须使用multipart/form-data作为request body。

版本:
Servlet 3.1 - Apache Tomcat 8.0.33

二、方法概述

方法描述
void delete()删除磁盘上关于此part对象的缓存文件
java.lang.String getContentType()获取浏览器传递过来的ContentType
java.lang.String getHeader(java.lang.String name)获取浏览器传递过来的特定的header,参数是header的名字
java.util.Collection getHeaderNames()获取传递给这个part的所有header的名字
java.util.Collection getHeaders(java.lang.String name)获取该name对应的所有的value
java.io.InputStream getInputStream()获取InputStream对象,可以用于获取上传的文件的内容
java.lang.String getName()获取对应于此part的multipart表单的名字
long getSize()获取此part的大小,如果是上传文件的话,表示上传的文件大小
java.lang.String getSubmittedFileName()如果此part表示上传文件的话,返回上传的文件的名字
void write(java.lang.String fileName)一个比较方便的方法,将上传的文件写入磁盘中

三、@MultipartConfig注解

用于处理文件上传的servlet必须使用@MultipartConfig注解,@MultipartConfig注解有4个属性。

属性类型概述
fileSizeThresholdint文件大小阀值,当文件大小大于此值时,文件将被写入磁盘
locationString服务器端目录,服务器把客户端上传的文件默认存入此目录下
maxFileSizelong允许上传的文件的最大大小,默认是-1,表示没有限制
maxRequestSizelong限制该multipart/form-data请求的最大数据量,默认是-1,表示没有限制

FileSize表示上传的一个文件的大小,RequestSize表示一次上传的总的数据量。简单来说,就是可以在一个表单中一次上传多个文件。

四、处理文件上传的servlet

//此处的@MultipartConfig注解给出了文件存放的地址和允许上传的文件最大值
@MultipartConfig(location="F:/", maxFileSize = 1024*1024*20)
@WebServlet(name="UploadFileTest", urlPatterns="/upload")
public class UploadFileTest extends HttpServlet{
    private static final long serialVersionUID = 1L;
    //使用了commons-logging和log4j来处理日志
    private static Log log = LogFactory.getLog(UploadFileTest.class);
    //获取注解中设置的值
    private static MultipartConfig config
        = UploadFileTest.class.getAnnotation(MultipartConfig.class);
    public UploadFileTest() {
        // TODO Auto-generated constructor stub
    }

    public void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
        request.setCharacterEncoding("UTF-8");
        Part part = null;
        try{
            part = request.getPart("file");//获取part用于处理上传的文件
        }catch(IllegalStateException ise){
        //上传的单个文件超出maxFileSize或者上传的总的数据量超出maxRequestSize时会抛出此异常
            if(config.maxRequestSize() == -1L)//如果注解中没设置此项,那就是单个文件超出限制
                log.error("单个文件超限");
            else if(config.maxFileSize() == -1L)//如果注解中没有设置单个文件最大限制,那就是总数据量超限。
                log.error("总数据量超限");
            else
                log.error("Error");
        }

        if(part == null)
            return;

        String fileName = part.getSubmittedFileName();//获得上传的文件名,没有判断用户没有选择文件直接提交的情况,没有判断上传文件失败的情况

        log.info("contentType : " + part.getContentType());
        log.info("fileName : " + fileName);
        log.info("fileSize : " + part.getSize());
        log.info("header names :");
        for(String headerName : part.getHeaderNames())
            log.info(headerName + " : " + part.getHeader(headerName));

        //为了避免文件重名,将时间组合到了文件名中。实际项目中可以考虑使用用户主键或者生成一个唯一的ID来组合文件名。
        String saveName = System.currentTimeMillis() + fileName;
        part.write(saveName);//将上传的文件保存到磁盘,默认是注解中location的相对地址,也可以传入一个绝对路径

        response.setContentType("text/html;charset=UTF-8");
          PrintWriter out = response.getWriter();

          String docType =
          "<!doctype html public \"-//w3c//dtd html 4.0 " +
          "transitional//en\">\n";
          out.println(docType +
                    "<html>\n" +
                    "<head><title>Upload File</title></head>\n" +
                    "<body bgcolor=\"#f0f0f0\">\n" +
                    "<h1 align=\"center\">Upload File</h1>\n" +
                    "<h2 align=\"center\">上传文件" + fileName+ "成功," +
                    "可以到项目目录的F:\\下查看,保存的文件名是:"+
                    saveName+"</h2>\n" +
                    "</body></html>");
    }
}

五、前端html页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Upload File</title>
</head>
<body>

<form action="upload" method="POST" enctype="multipart/form-data">
    <table align="center" border="1" width="50%">
        <tr>
            <td>选择要上传的文件:</td>
            <td><input type="file" name="file"></td>
        </tr>
        <tr>
            <td><input type="submit" value="上传"></td>
        </tr>
    </table>
</form>

</body>
</html>

servlet使用了注解的方式注册,所以不再需要使用web.xml文件。新建一个web工程,就使用这两个文件就可以部署到tomcat了,要访问的url是http://localhost:8080/UploadFileTest/UploadFile.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值