serlvet表单文件的上传
2013-09-09 08:31
465 查看
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.servlet.*; import org.apache.commons.fileupload.disk.*; publicclass UploadServlet extends HttpServlet { private String filePath; // 文件存放 private String tempPath; // 临时文件 // 初始化 publicvoid init(ServletConfig config) throws ServletException { super.init(config); filePath = config.getInitParameter("filepath"); tempPath = config.getInitParameter("temppath"); ServletContext context = getServletContext(); filePath = context.getRealPath(filePath); tempPath = context.getRealPath(tempPath); } // doPost publicvoid doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/plain;charset=gbk"); PrintWriter pw = res.getWriter(); try{ DiskFileItemFactory diskFactory = newDiskFileItemFactory(); // threshold 极限、临界值,即硬盘缓存 1M diskFactory.setSizeThreshold(4 * 1024); // repository 贮藏室,即临时文件目录 diskFactory.setRepository(new File(tempPath)); ServletFileUpload upload = new ServletFileUpload(diskFactory); // 设置允许上传的最大文件大小 4M upload.setSizeMax(4 * 1024 * 1024); // 解析HTTP请求消息头 List fileItems = upload.parseRequest(req); Iterator iter = fileItems.iterator(); while(iter.hasNext()) { FileItem item = (FileItem)iter.next(); if(item.isFormField()) { System.out.println("处理表单内容 ..."); processFormField(item, pw); }else{ System.out.println("处理上传的文件 ..."); processUploadFile(item, pw); } }// end while() pw.close(); }catch(Exception e){ System.out.println("使用 fileupload 包时发生异常 ..."); e.printStackTrace(); }// end try ... catch ... }// end doPost() // 处理表单内容 privatevoid processFormField(FileItem item, PrintWriter pw) throws Exception { String name = item.getFieldName(); String value = item.getString(); pw.println(name + " : " + value + "\r\n"); } // 处理上传的文件 privatevoid processUploadFile(FileItem item, PrintWriter pw) throws Exception { // 此时的文件名包含了完整的路径,得注意加工一下 String filename = item.getName(); System.out.println("完整的文件名:" + filename); int index = filename.lastIndexOf("\\"); filename = filename.substring(index + 1, filename.length()); long fileSize = item.getSize(); if("".equals(filename) && fileSize == 0) { System.out.println("文件名为空 ..."); return; } File uploadFile = new File(filePath + "/" + filename); item.write(uploadFile); pw.println(filename + " 文件保存完毕 ..."); pw.println("文件大小为 :" + fileSize + "\r\n"); } // doGet publicvoid doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { doPost(req, res); } }web.xml 文件
<?xmlversion="1.0"encoding="gb2312"?> <web-appxmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>UploadServlet</servlet-class> <init-param> <param-name>filepath</param-name> <param-value>uploadFile</param-value> </init-param> <init-param> <param-name>temppath</param-name> <param-value>temp</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> </web-app>
程序运行过程截图:(在 web.xml 文件中我们把UploadServlet 映射为 upload)
1、启动 Tomcat ,在浏览器输入 URL 并填写 HTML 表单,如下:
![](http://img1.51cto.com/attachment/201008/5/1177454_1281022700npel.jpg)
2、点击“上传”,发出一个包含了上传文件的复杂 HTTP 请求,由 UploadServlet 进行处理:
先看下 Tomcat 的控制台输出信息:
![](http://img1.51cto.com/attachment/201008/5/1177454_1281022702nqeP.jpg)
再看一下浏览器的相应输出:
![](http://img1.51cto.com/attachment/201008/5/1177454_1281022703Gmld.jpg)
最后看上传的文件是否被被保存在指定的目录中:
![](http://img1.51cto.com/attachment/201008/5/1177454_1281022704EWVd.jpg)
嗯,文件目录和文件保存时间都正确,就是文件大小忘了转化一下…(*^__^*) …
小结:
1、使用开源的 fileupload 包为我们在 UploadServlet 代码中显式地用繁杂的 request.getParameter(“username”) 语句来获取 HTTP 请求所包含的表单值;
2、而且还省去了我们在 UploadServlet 中自己编写判断表单是否是文件或文本类型的代码;
3、更重要的是,FileItem 对象的响应方法可以使得我们轻松地获取文件名、文件大小、路径等等;
4、最重要的是,使用 JD-GUI 反编译器简单地看看开源的 fileupload 包中的类组织结构,这更加有意思、有用处,:-D
相关文章推荐
- WebUploader 上传的文件与表单接收方法
- 基于Spring3 MVC实现基于form表单上传Excel文件,批量导入数据!
- java客户端模拟表单上传文件
- servlet接受form表单d值和文件上传
- 文件上传之form表单篇
- nodejs 实现模拟form表单上传文件
- 使用ajax提交form表单,包括ajax文件上传
- iframe标签实现form表单提交(如文件上传下载)不刷新
- springmvc-普通form表单提交 4000 方式实现文件上传
- Asp多表单域无组件文件上传的例子
- form表单中的文件上传下载
- 用struts2 完成一个简单的通讯录,实现增删改查,分页,文件上传(头像),表单验证(两种方法)
- 文件上传(jspsmart实现)file和text表单同时提交的问题
- 为什么上传文件的表单里要加个属性 enctype
- ajax异步表单提交,并实现文件上传
- HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
- Ext.js5表单的文件上传(toast)(30)
- winform模拟asp.net的表单上传文件
- java 模拟表单方式提交上传文件
- php 利用fsockopen GET/POST 提交表单及上传文件