成都网站建设设计

将想法与焦点和您一起共享

javaweb中的servlet3upload上传文件实践-创新互联

Servlet 3.0之前的版本中,文件上传是个挺让人头疼的问题,虽然有第三方框架来实现,但使用也还是比较麻烦,在Servlet 3.0中,这些问题将不复存在,Servlet 3.0对文件上传提供了直接支持,配合Servlet 3.0中基于Annotations的配置,大大简化上传件的操作。

目前成都创新互联已为千余家的企业提供了网站建设、域名、网络空间、网站托管、企业网站设计、新干网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

一、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个属性。

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

四、处理文件上传的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 =
  "\n";
  out.println(docType +
   "\n" +
   "Upload File\n" +
   "\n" +
   "

Upload File

\n" + "

上传文件" + fileName+ "成功," + "可以到项目目录的F:\\下查看,保存的文件名是:"+ saveName+"

\n" + ""); } }

本文名称:javaweb中的servlet3upload上传文件实践-创新互联
文章网址:http://chengdu.cdxwcx.cn/article/ddcodi.html