前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Servlet3.0实现上传文件的获取

Servlet3.0实现上传文件的获取

作者头像
mythsman
发布2022-11-14 15:44:47
8350
发布2022-11-14 15:44:47
举报
文章被收录于专栏:mythsman的个人博客

据说在以前的Servlet版本中,如果想要处理form中post过来的文件数据的话,那么还必须下载第三方的包,比如commons-fileupload等,很是麻烦。但是现在的Servlet版本中已经可以支持对file数据的直接处理,这里姑且记录下简单的用法。

Html端

前端中只要写一个正常提交的表单即可,比如下面这样:

代码语言:javascript
复制
<form action="Display" method="post" enctype="multipart/form-data">
                <label>上传文件:<label>
                <input type="file" name="file">
                <input type="submit" value="上传">
</form>

当然也可以用ajax的form来提交,这都无妨。

Servlet端

首先需要在Servlet类定义前加上@MultipartConfig标注,然后在doPost方法里这么写:

代码语言:javascript
复制
protected void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
        //设置字符集
	request.setCharacterEncoding("utf-8");
        //用parts来接收数据并保存到本地路径中(考虑到可能有多个文件,因此循环读入)
	Collection<Part> parts = request.getParts();
	for (Part part : parts) {
		part.write("tmp.txt");
                //对tmp.txt做点什么
	}
        //返回信息
	PrintWriter out = response.getWriter();
	out.println("上传成功");
	out.flush();
	out.close();
}

这样就可以将客户上传的文件在本地保存下来了,非常简单方便(但是不知道的话还真的很麻烦)。

通常这样就足够了,但是有时候我们还需要知道文件的名字,这就稍微麻烦一点了,还得解析协议的header来获得文件名:

代码语言:javascript
复制
protected void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
        //设置字符集
	request.setCharacterEncoding("utf-8");

        Part part = request.getPart("file");//通过表单file控件(<input type="file" name="file">)的名字直接获取Part对象

        String header = part.getHeader("content-disposition");//获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"

        String fileName = getFileName(header);//获取文件名

	part.write(fileName);

        //返回信息
	PrintWriter out = response.getWriter();
	out.println("上传成功");
	out.flush();
	out.close();
}

public String getFileName(String header) {
    /**
    * String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
    * 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
    * IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
    */
    String[] tempArr1 = header.split(";");
    /**
    *火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
    *IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
    */
    String[] tempArr2 = tempArr1[2].split("=");
    /获取文件名,兼容各种浏览器的写法
    String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")+1).replaceAll("\"", "");
    return fileName;
}

参考

使用Servlet3.0提供的API实现文件上传

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Html端
  • Servlet端
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档