在web中上传文件

来源:互联网 发布:js实现二级联动菜单 编辑:程序博客网 时间:2024/06/05 23:57
 


实现web开发中的文件上传功能,需完成以下两步操作:在web页面中添加上传输入项;在servlet中读取上传文件的数据,并保存到本地硬盘中。

在web页面中添加上传输入项的方法:

<input type=“file”>标签用于在web页面中添加文件上传输入项

1、必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。

2、必须把form的enctype属值设为multipart/form-data.设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

jsp部分代码:

 

     <form action="${pageContext.request.contextPath}/demo.do" method="post"                 enctype="multipart/form-data">   用户名:<input type="text" name="username" /><br/>   文件:<input type="file" name="file1" /><br/>   <input type="submit" value="上传" /><br/>      </form>


在Servlet中读取文件上传数据,并保存到本地硬盘中

通过Request对象提供了一个getInputStream方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作,示例。

在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。

DiskFileItemFactory 是创建 FileItem 对象的工厂,常用方法:

public void setSizeThreshold(int sizeThreshold)

设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时, fileupload组件将使用临时文件缓存上传文件。

public void setRepository(java.io.File repository)

指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").

public DiskFileItemFactory(int sizeThreshold, java.io.File repository)

构造函数

ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:

boolean isMultipartContent(HttpServletRequest request)

判断上传表单是否为multipart/form-data类型

List parseRequest(HttpServletRequest request)

解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。

setFileSizeMax(long fileSizeMax)

设置上传文件的最大值

setSizeMax(long sizeMax)

设置上传文件总量的最大值

setHeaderEncoding(java.lang.String encoding)

设置编码格式

setProgressListener(ProgressListener pListener)

获取进度监视器ProgressListener 对象

实现步骤

1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录

2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。

3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。

4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件

为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值

为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。

Servlet的部分代码:

     

 try {           // 1 建立工厂对象           DiskFileItemFactory factory = new DiskFileItemFactory();            // 2 获取解析器           ServletFileUpload upload = new ServletFileUpload(factory);           // 3 对请求对象进行解析,得到存放FileItem的list对象           List<FileItem> list = upload.parseRequest(request);            // 4 对FileItem对象列表进行迭代           for (FileItem item : list) {              // 普通输入项              if (item.isFormField()) {                   String paramName = item.getFieldName();                  String paramValue = item.getString();                  // 乱码问题的彻底解决                  paramValue = new String(paramValue.getBytes("iso8859-1"),                         "utf-8");                  System.out.println("普通输入项:" + paramName + " = " + paramValue);                  //获得用户名                  String name = paramValue;                 }                // 上传文件              else {                  String fileName = item.getName();                  System.out.println("filename = " + fileName);                  //如果上传的是文件路径,就将文件路径打印出来                  fileName = fileName                         .substring(fileName.lastIndexOf("\\") + 1);                  System.out.println("filename = " + fileName);                  InputStream in = item.getInputStream();                  byte[] buffer = new byte[1024];                  int len = 0;                   FileOutputStream fos = new FileOutputStream("D:\\"                         + fileName);                    while ((len = in.read(buffer)) > 0) {                     fos.write(buffer, 0, len);                  }                   fos.flush();                  in.close();                  fos.close();                  request.setAttribute("message", "上传成功!!!");              }           }        } catch (Exception e) {           e.printStackTrace();           request.setAttribute("message", "上传失败!!");       }       request.getRequestDispatcher("/message.jsp").forward(request, response);       


 

原创粉丝点击