利用开源组件commons-fileupload上传图片文件(1)
2014-10-31 16:50
387 查看
本节主要介绍用commons-fileupload-1.1.jar包实现基本的文件上传功能(此处是图片上传,但是文件上传本质都是一样的,此处通过控制文件后缀来达到上传图片到服务器根目录的目的),即上传文件到指定的目录中,同时介绍上传过程中使用到的相关类及其方法。
废话少说,直接写步骤。
1.引入jar包
jar文件会在文章结尾处给出下载链接。当然,如果要链接数据库,需要引入相应的jar包,请自行下载。
2.前端上传页面(支持多文件上传)
上传功能已经编写完成。可以进入以上目录查看效果。
-----------------------------------------------------------------------------------------------------------------------------------------------------
以下是一些主要的类和方法的解释:
*DiskFileItemFactory
* 实现了FileItemFactory接口
* 主要方法有:
* public FileItem createItem(String fieldName, String contentType, boolean isFormField, String fileName)
* setRepository(File repository);设置缓存路径 也有相应的get方法
* setSizeThreshold(int sizeThreshold);设置上传文件内存缓冲区的大小 也有相应的get方法
*
* ServletFileUpload
* 从FileUpload继承,而FileUpload又从FileUploadBase继承
* ServletFileUpload(FileItemFactory fileItemFactory);传入一个fileItemFactory对象,构造ServletFileUpload对象
* List parseRequest(HttpServletRequest request);从request中获得文件请求列表
* void setSizeMax(long sizeMax);//设置允许上传文件大小 也有相应的get方法
* setHeaderEncoding(String encoding);//设置上传文件名编码的格式 也有相应的get方法
*
* Pattern
* 正则表达式的编译表示形式,指定为字符串的正则表达式必须首先被编译为此类的实例。
* 然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配
* static Pattern compile(String regex);将给定的正则表达式编译到模式中
* Matcher matcher(CharSequence input);创建匹配给定输入与此模式的匹配器,返回此模式的新匹配器
*
* FileItem
* 抽象接口,继承Serializable
* boolean isFormField();判断FileItem类对象封装的数据是否属于一个普通表单字段,
* 还是属于一个文件表单字段,如果是普通表单字段则返回true,否则返回false
* String getName();用于获得文件上传字段中的文件名
* String getFieldName();用于返回表单字段元素的name属性值
* long getSize();获得上传文件的大小 单位:字节
* getContentType();用于获得上传文件的类型
* void write(File paramFile);用于将FileItem对象中保存的主体内容保存到某个指定的文件中
*
* Matcher
* 通过解释 Pattern 对 character sequence 执行匹配操作的引擎。
* 通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
* matches方法尝试将整个输入序列与该模式匹配。
* lookingAt 尝试将输入序列从头开始与该模式匹配。
* find 方法扫描输入序列以查找与该模式匹配的下一个子序列。
* String group(int group)返回在以前匹配操作期间由给定组捕获的输入子序列
*
* String
* boolean endsWith(String suffix)测试此字符串是否以指定的后缀结束。
如果想将图片名称存入数据库,请看我的下一篇博文。
commons-fileuploadjar包下载 项目下载
废话少说,直接写步骤。
1.引入jar包
jar文件会在文章结尾处给出下载链接。当然,如果要链接数据库,需要引入相应的jar包,请自行下载。
2.前端上传页面(支持多文件上传)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>文件上传</title> <meta name="Generator" content="EditPlus"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script> //文件提交之前一个简单的js校验 function upFile() { //获得File的值 var a = this.uploadform.a.value; var b = this.uploadform.b.value; var c = this.uploadform.c.value; //三个文件表单同时为空的时候提示 if (a == "" && b == "" && c == "") { alert("请选择文件"); return; } //验证完成后跳转到指定的servlet处理 this.uploadform.action = "upload";//不能有左斜杠/ 用此种方式访问后跳转的url为:http://localhost:8080/UpDown/upload OK //错误的方式- this.uploadform.action="/upload"; 用此种方式访问后跳转的url为:http://localhost:8080/upload NG this.uploadform.submit(); } //得到文件的后缀名 function expType(obj) { var re = /(\\+)/g; var error = obj.replace(re, "#").split("#"); var fileName = error[error.length - 1]; //如test.txt var expData = fileName.split("."); var expType = expData[expData.length - 1];//得到文件a的后缀名txt return expType; } //动态校验上传文件的后缀名 function verify(id) { var fileValue = document.getElementById(id).value; var expName = expType(fileValue); var errorType = new Array(".exe", ".com", ".cgi", ".asp", ".txt", ".bat", ".dll", ".wps", ".ppt", ".docx");//这些后缀名的文件不能上传 for (i in errorType) { if (errorType[i] == ("." + expName)) { alert(errorType[i] + "格式的文件不能上传"); document.getElementById(id).value = ""; } } } </script> </head> <body> <strong>文件上传演示demo---上传到本机文件夹中(程序和上传目录在同一主机)</strong> <!-- 1.上传的内容有图片的时候,form中必须加入 ENCTYPE="multipart/form-data" 2.在<input>标签中必须有name属性(除了提交按钮submit),否则运行时虽然不会报错,但是文件无法成功上传 --> <form name="uploadform" method="POST" action="upload" ENCTYPE="multipart/form-data"> <table border="1" width="450" cellpadding="4" cellspacing="2" bordercolor="#9BD7FF"> <tr> <td width="100%" colspan="2">文件1: <input id="aFile" name="a" size="40" type="file" onblur="verify(id)"> <!-- onblur="" --></td> </tr> <tr> <td width="100%" colspan="2">文件2: <input id="bFile" name="b" size="40" type="file" onblur="verify(id)"></td> </tr> <tr> <td width="100%" colspan="2">文件3: <input id="cFile" name="c" size="40" type="file" onblur="verify(id)"></td> </tr> </table> <table> <tr> <td align="center"> <!-- <input name="upload" type="submit" value="开始上传" /> --> <input name="upload" type="button" value="开始上传" onclick="upFile()" /> </td> </tr> </table> </form> </body> </html>3.编写上传文件的servlet. Upload.java
package upload; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /**此程序是上传文件到指定的目录的一个小小的demo * 有以下两个要求:(1)上传的文件不能超过文件指定的最大值(2)对有些后缀名的文件不能上传 */ /** * Module: Upload.java Description: 上传文件到指定的目录(程序和上传的目录在同一台主机) Company: XXX * Author: ptp Date: Feb 6, 2012 */ public class Upload extends HttpServlet { // 定义常量,保存文件路径 private static final String FILE_PATH = "D:" + File.separator + "test" + File.separator + "upload" + File.separator;// 文件上传的路径 private static final String FILE_TEMP = "D:" + File.separator + "test" + File.separator + "temp" + File.separator;;// 文件缓存路径 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=utf-8"); PrintWriter out = response.getWriter(); // ServletFileUpload.isMultipartContent(request); // 可以处理之前用上面的方法检测request中是否有multipart内容,不过,已经是废弃的方法了 // 生成DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 对工厂进行相关的配置 // 设置最多只允许在内存中存储的数据,单位:字节 factory.setSizeThreshold(2048000); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 文件缓存路径 【暂时没有实现这个功能】 // 判断指定的目录是否存在,如果不存在则新建该目录,注意mkdirs()和mkdir()的区别: // 如果test不存在,用mkdir()程序会在后面会报错,用mkdirs()就不会报错 File fileTemp = new File(FILE_TEMP); if (!fileTemp.exists()) { fileTemp.mkdirs(); } File filePath1 = new File(FILE_PATH); if (!filePath1.exists()) { filePath1.mkdir();// 此处可以用mkdir()方法,因为前面的代码执行后test目录一定存在 } // 设置缓存路径 factory.setRepository(fileTemp); // 将DiskFileItemFactory对象传给ServletFileUpload构造方法,生成上传类ServletFileUpload的对象 ServletFileUpload sevletFileUpload = new ServletFileUpload(factory); // 设置允许用户上传文件大小,单位:字节,这里设为20M sevletFileUpload.setSizeMax(20 * 1024 * 1024); // 设置编码,解决上传文件名乱码 sevletFileUpload.setHeaderEncoding("utf-8"); /** 按照JDK的介绍,此方法是解决上传文件名中文乱码问题,但是后面测试发现不能实现 */ // 获得允许用户上传文件大小 long maxSize = sevletFileUpload.getSizeMax(); try { /** * 开始读取上传信息 从request中取到上传文件列表 超过了设置的最大值2M会报异常 * 文件缓存目录不存在也会报异常(前面已经对目录存在做了判断,所以不可能出现目录不存在报的情况) */ List fileItems = sevletFileUpload.parseRequest(request); // 调用上传文件的方法 if (null != fileItems) upLoadFile(fileItems, out); } catch (FileUploadException e) { out.println("对不起,您上传的文件大小超过了允许的最大值" + maxSize / 1024 / 1024 + "M!"); e.printStackTrace(); } } /** * 上传文件 * * @param fileItems * @param out */ public void upLoadFile(List fileItems, PrintWriter out) throws IOException { // 依次处理每个上传的文件 Iterator iter = fileItems.iterator(); // 过滤掉的文件类型 // String[] errorType = { ".jpg", ".jpeg", ".png", ".gif" }; while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); /* * 忽略其他不是文件域的所有表单信息 isFormField()方法判断FileItem类对象封装的数据是否属于一个普通表单字段, * 还是属于一个文件表单字段,如果是普通表单字段则返回true,否则返回false只有是文件表单字段才能进入if中的代码 */ if (!item.isFormField()) { String name = item.getName();// 用于获得上传文件的名称,如:c:\documents // // and if (!name.equals("") || !"".equals(name)) { String houzhui = name.substring(name.lastIndexOf(".")); System.out.println(houzhui); if (houzhui.equals(".jpg") || houzhui.equals(".jpeg") || houzhui.equals(".png")) { // 上传操作 long size = item.getSize();// 获得上传文件的大小 if ((name == null || name.equals("")) && size == 0)// 文件表单为空或文件大小为0跳过本次循环,继续下一次循环 continue; try { // 保存上传的文件到指定的目录 File filePath = new File(FILE_PATH + name); item.write(filePath); // 在页面上输出上传文件后的信息 out.print(name + " " + size + "<br>"); return; } catch (Exception e) { e.printStackTrace(); out.println(e); } } else { out.print("上传失败:上传的文件后缀不合法"); return; } } } } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }4.在web.xml中配置servlet。(或者在创建Upload.java时创建servlet而非class)
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>upload</servlet-name> <servlet-class>upload.Upload</servlet-class> </servlet> <servlet-mapping> <servlet-name>upload</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> </web-app>到此配置结束。根据程序设置,会在D盘下面生成如下目录(与服务器主机在同一目录下的磁盘)
上传功能已经编写完成。可以进入以上目录查看效果。
-----------------------------------------------------------------------------------------------------------------------------------------------------
以下是一些主要的类和方法的解释:
*DiskFileItemFactory
* 实现了FileItemFactory接口
* 主要方法有:
* public FileItem createItem(String fieldName, String contentType, boolean isFormField, String fileName)
* setRepository(File repository);设置缓存路径 也有相应的get方法
* setSizeThreshold(int sizeThreshold);设置上传文件内存缓冲区的大小 也有相应的get方法
*
* ServletFileUpload
* 从FileUpload继承,而FileUpload又从FileUploadBase继承
* ServletFileUpload(FileItemFactory fileItemFactory);传入一个fileItemFactory对象,构造ServletFileUpload对象
* List parseRequest(HttpServletRequest request);从request中获得文件请求列表
* void setSizeMax(long sizeMax);//设置允许上传文件大小 也有相应的get方法
* setHeaderEncoding(String encoding);//设置上传文件名编码的格式 也有相应的get方法
*
* Pattern
* 正则表达式的编译表示形式,指定为字符串的正则表达式必须首先被编译为此类的实例。
* 然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配
* static Pattern compile(String regex);将给定的正则表达式编译到模式中
* Matcher matcher(CharSequence input);创建匹配给定输入与此模式的匹配器,返回此模式的新匹配器
*
* FileItem
* 抽象接口,继承Serializable
* boolean isFormField();判断FileItem类对象封装的数据是否属于一个普通表单字段,
* 还是属于一个文件表单字段,如果是普通表单字段则返回true,否则返回false
* String getName();用于获得文件上传字段中的文件名
* String getFieldName();用于返回表单字段元素的name属性值
* long getSize();获得上传文件的大小 单位:字节
* getContentType();用于获得上传文件的类型
* void write(File paramFile);用于将FileItem对象中保存的主体内容保存到某个指定的文件中
*
* Matcher
* 通过解释 Pattern 对 character sequence 执行匹配操作的引擎。
* 通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
* matches方法尝试将整个输入序列与该模式匹配。
* lookingAt 尝试将输入序列从头开始与该模式匹配。
* find 方法扫描输入序列以查找与该模式匹配的下一个子序列。
* String group(int group)返回在以前匹配操作期间由给定组捕获的输入子序列
*
* String
* boolean endsWith(String suffix)测试此字符串是否以指定的后缀结束。
如果想将图片名称存入数据库,请看我的下一篇博文。
commons-fileuploadjar包下载 项目下载
相关文章推荐
- 利用开源组件commons-fileupload上传图片文件(2)
- 利用commons-fileupload组件实现文件上传-实例
- 利用commons-fileupload组件上传文件至服务器和数据库
- 利用commons-fileupload组件实现文件上传-实例
- java利用commons-fileupload组件实现文件的上传与下载
- 利用commons-fileupload组件上传文件至服务器和数据库- -
- 利用commons-fileupload组件上传文件至服务器和数据库
- JAVAWEB开发之文件的上传与下载(开源组件commons-fileupload的详细使用)
- 在JSP环境中利用Commons-fileupload组件实现文件上传
- commons-fileupload(apache开源文件上传组件)使用方式
- 在JSP环境中利用Commons-fileupload组件实现文件上传
- 利用commons-fileupload组件上传文件至服务器和数据库(ZT)
- servlet文件上传(2)---》利用commons-fileupload组件
- commons_fileupload组件 简单文件上传
- 利用fileupload组件进行文件上传
- 利用Commons组件上传文件
- java web 利用 commons-fileupload-1.2 实现文件上传 解决 中文乱码& 非文件属性的读取
- commons-fileUpload组件解决文件上传乱码问题
- 使用commons-fileupload组件上传下载文件
- 一个小例子(利用commons-fileupload上传文件)