/**
* 上传测试控制类
* @author icesong
* @date 2015-6-19 上午10:54:50
*/
public class FileUpload extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
UploadUtil upload=new UploadUtil(request);
Object [] objkeys=upload.getKeys();//获取所有key
for(Object o:objkeys){
System.out.println("----"+(String)o+"----");
}
Object [] obj=upload.getParameterValues("file1");
File file=(File) obj[0];
System.out.println(file.getName());
System.out.println(obj[0]);
Object [] date=upload.getParameterValues("date");
System.out.println("----"+date[0]);
Iterator it=upload.getFormData().entrySet().iterator();
while(it.hasNext()){
Map.Entry<String, Object> entry=(Entry<String, Object>) it.next();
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
}
System.out.println("----------");
RequestDispatcher dispatcher=request.getRequestDispatcher("/success.jsp");
dispatcher.forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.unisure.fileUpload;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.io.File;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.StringUtils;
import common.Logger;
import freemarker.template.SimpleDate;
/**
* <p>
* 功能描述:上传辅助工具类
* </p>
* - 依赖 commons-fileupload.jar包
* - 使用 /upload_config.properties作为上传配置
* @author icesong
* @date 2014-5-29
* @version 1.0
*
* version 1.1 modify by icesong
* 添加了表单项重名将不被覆盖功能
*
*/
public class UploadUtil {
private Logger log = Logger.getLogger(getClass());
private static final String UPLOAD_CONFIG_FILE_NAME = "upload_config";
private String saveDir = "";//服务器保存用户上传文件的文件夹
private String photoSaveDir = "";//服务器保存用户上传拍照文件的文件夹
private int thresholdSize = 0;//内存中缓存数据大小,单位为byte
private String repository = "";//一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
private long fileSizeMax = 0;//单个上传文件的最大大小,单位:字节
private long sizeMax = 0;//一次上传多个文件的总大小,单位:字节
private String headerEncoding = "";//文件名编码
private boolean randomFileName = false;//文件名是否随机生成(false表示使用客户端上传文件的文件名)
private int saveCycle=1;
private String beginDateStr;
private String unit;
private Map<String,Object> formData = new HashMap<String,Object>();//存储解析后filename,value
public UploadUtil() {
loadProperties();//读取配置
}
public UploadUtil(HttpServletRequest request) throws Exception {
loadProperties();//读取配置
parseRequest(request);
}
/**
* 方法描述: 使用/upload_config.properties配置文件作为上传配置
* 如果读取失败将启用默认配置
* @author 曾灿辉
*/
private void loadProperties() {
try {
//服务器保存用户上传文件的文件夹
this.saveDir = PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.SAVEDIR");
//服务器保存用户上传拍照文件的文件夹
this.photoSaveDir = PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "PHOTO.UPLOAD.SAVEDIR");
//内存中缓存数据大小,单位为byte
this.thresholdSize = Integer.parseInt(PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.SIZE.THRESHOLD"));
//一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
this.repository = PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.REPOSITORY");
//单个上传文件的最大大小,单位:字节
this.fileSizeMax = Long.parseLong(PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.SIZE.FILEMAX"));
//一次上传多个文件的总大小,单位:字节
this.sizeMax = Long.parseLong(PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.SIZE.MAX"));
//文件名编码
this.headerEncoding = PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.HEADERENCODING");
//文件名是否随机生成(false表示使用客户端上传文件的文件名)
this.randomFileName =
(PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.FILENAME.RANDOM"))
.equals("1") ? true : false;
//创件文件夹的周期单位 D/天 M/月 Y/年
this.unit=PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.SAVECYCLE.UNIT");
//创件文件夹的周期
this.saveCycle=Integer.valueOf(PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.SAVECYCLE.NUM"));
//创件文件夹的起始日期
this.beginDateStr=PropertyReader.getValue(UPLOAD_CONFIG_FILE_NAME, "T.UPLOAD.SAVECYCLE.BEGIN");
} catch (Exception e) {
e.printStackTrace();
log.error(e.getStackTrace());
log.error("读取上传配置文件失败!启用默认配置");
this.saveDir = "E:"+File.separator+"UPLOAD";
this.thresholdSize = 1 * 1024 * 1024;// 1mb
this.repository = "TEMP";
this.fileSizeMax = 5 * 1024 * 1024;// 5mb
this.sizeMax = 10 * 1024 * 1024;// 10mb
this.headerEncoding = "utf-8";
this.randomFileName = false;
this.saveCycle=1;
this.unit="D";
}
}
/**
* 方法描述: 将request中用户上传的文件和提交的属性解析出来
* 暂不支持处理同名表单项(如表单项重名将被覆盖)
* @param request
* @return Map<表单项的Name属性, 用户上传的文件(java.io.File)或提交的属性(String)>
* @throws Exception
* @author icesong
*/
public void parseRequest(HttpServletRequest request) throws Exception {
//准备上传文件存放目录
ServletContext application = request.getSession(true).getServletContext();
this.saveDir=getSaveDir(saveDir);
//通过配置文件的周期来创建文件夹功能 需要调试
//this.saveDir=calculateDateDir(saveDir);
File uploadDirectory = new File(this.saveDir);
if(!uploadDirectory.exists()) {
uploadDirectory.mkdirs();
}
//设置参数
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(this.thresholdSize);//指定在内存中缓存数据大小,单位为byte
File repository = new File(application.getRealPath(File.separator + this.repository));
if(!repository.exists()) {
repository.mkdirs();
}
factory.setRepository(repository);//设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
ServletFileUpload upload = new ServletFileUpload(factory);
//upload.setFileSizeMax(this.fileSizeMax);//指定单个上传文件的最大尺寸,单位:字节 version: commons-fileupload-1.2.2
upload.setSizeMax(this.sizeMax);//指定一次上传多个文件的总尺寸,单位:字节
upload.setHeaderEncoding(this.headerEncoding);//设置文件名编码
List items = upload.parseRequest(request);//解析提交的字段和文件
Iterator iterator = items.iterator();
while(iterator.hasNext()) {//迭代所有表单项
FileItem fileItem = (FileItem)iterator.next();
if(!fileItem.isFormField()) {//如果是文件
DiskFileItem dfi = (DiskFileItem) fileItem;
String fileName = dfi.getName();
File file = null;
if(StringUtils.isBlank(fileName)) {//如果文件名为空
continue;
}
if(!randomFileName) {//使用上传表单项名作为文件名
file = new File(uploadDirectory + File.separator + this.getFileName(fileName));
file.createNewFile();
} else {//随机生成文件名
file = File.createTempFile("upload", "." + getFileSuffix(dfi.getName()), uploadDirectory);
}
dfi.write(file);//保存上传文件
saveDataInMap(fileItem.getFieldName(), file,formData);
dfi.delete();//删除缓存文件
} else{//提交的属性
saveDataInMap(fileItem.getFieldName(), fileItem.getString(),formData);
}
}
}
/**
* 方法描述: 保存解析出来属性名和对应属性值,重名则以集合形式保存
* @param name
* @param obj
* @param formData
* @author icesong
*/
private void saveDataInMap(String name,Object obj,Map<String,Object> formData){
Object objv = formData.get(name);
if (objv == null) {
formData.put(name, obj);
} else {
List list = null;
if (objv instanceof List) {
list = (List) objv;
list.add(obj);
} else {
Object strv = (Object) objv;
list = new ArrayList();
list.add(strv);
list.add(obj);
}
formData.put(name, list);
}
}
/**
* 方法描述: 创建文件夹路径
* @param saveDir
* @return
* @throws ParseException
* @author icesong
*/
private String calculateDateDir(String saveDir) throws ParseException{
Date date=new Date();
Date begindate = new SimpleDateFormat("yyyy-MM-dd").parse(beginDateStr);
int differDate=0;
String dir="";
Date resultDate=null;
String formatStr="yyyyMMdd";
try{
if("D".equals(unit)){
formatStr="yyyyMMdd";
date=new SimpleDateFormat("yyyyMMdd").parse(new SimpleDateFormat("yyyyMMdd").format(date));
long second=date.getTime()-begindate.getTime();
differDate=(int) (second/(60*1000*60*24))+1;////计算出两日期相差多少天
if(differDate%saveCycle!=0){
long c=date.getTime()-(differDate%saveCycle)*(60*1000*60*24);
resultDate=new Date(c);
}
else{
resultDate=date;
}
}
else if("M".equals(unit)){
formatStr="yyyyMM";
Calendar bef = Calendar.getInstance();
Calendar aft = Calendar.getInstance();
bef.setTime(begindate);
aft.setTime(date);
int year = aft.get(Calendar.YEAR) - bef.get(Calendar.YEAR);
int month = aft.get(Calendar.MONTH) - bef.get(Calendar.MONTH);
differDate=12*year+month+1;//计算出两日期相差多少个月
int j=((differDate-saveCycle)/saveCycle+1)*saveCycle-(saveCycle-1);
bef.add(Calendar.MONTH, j-1);
resultDate=bef.getTime();
}
else if("Y".equals(unit)){
formatStr="yyyy";
Calendar bef = Calendar.getInstance();
Calendar aft = Calendar.getInstance();
bef.setTime(begindate);
aft.setTime(date);
differDate = aft.get(Calendar.YEAR)-bef.get(Calendar.YEAR)+1;//计算出两日期相差多少年
if(differDate%saveCycle!=0){
int j=differDate%saveCycle;
aft.add(Calendar.YEAR, -j);
resultDate=aft.getTime();
}
else{
resultDate=date;
}
}
String str=new SimpleDateFormat(formatStr).format(resultDate);
dir=saveDir+File.separator+str;
}catch(Exception e){
log.error(e.getStackTrace());
log.error("根据配置文件创建文件夹失败,启用默认文件夹");
dir=saveDir+File.separator+"ExceptionDir";
}
return dir;
}
/**
* 方法描述: 获取文件夹路径
* @param saveDir
* @return
* @author icesong
*/
private String getSaveDir(String saveDir){
String formatStr="yyyyMMdd";
if("D".equals(this.unit)){
formatStr="yyyyMMdd";
}
else if("M".equals(this.unit)){
formatStr="yyyyMM";
}
else if("Y".equals(this.unit)){
formatStr="yyyy";
}
SimpleDateFormat sdf=new SimpleDateFormat(formatStr);
Date date=new Date();
String str=sdf.format(date);
String dir=saveDir+File.separator+str;
return dir;
}
/**
* <p>
* 方法描述:根据filename返回值
* </p>
* @param name
* @return
*/
public Object getParameter(String name){
Object obj = formData.get(name);
if(obj==null){
return null;
}else{
return obj;
}
}
/**
* 方法描述: 根据filename返回数组值
* @param name
* @return
* @author icesong
*/
public Object[] getParameterValues(String name){
List list=null;
Object obj=formData.get(name);
if(obj==null){
return null;
}else{
if(obj instanceof List){
list= (List) formData.get(name);
}
else{
list=new ArrayList();
list.add(obj);
}
return list.toArray();
}
}
/**
* 方法描述: 返回保存在map key值(filename)
* @return
* @author icesong
*/
public Object [] getKeys(){
List li=new ArrayList();
Iterator it=formData.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String, Object> entry=(Entry<String, Object>) it.next();
li.add(entry.getKey());
}
if(li.size()==0){
return null;
}
else{
return li.toArray();
}
}
/**
* 方法描述: 提取文件名后缀
* @param fileName 文件名0
* @return
* @author icesong
*/
public String getFileSuffix(String fileName) {
return fileName.substring(fileName.lastIndexOf(".") + 1);
}
/**
* 方法描述: 提取文件名后缀
* @param file 文件
* @return
* @author icesong
*/
public String getFileSuffix(File file) {
String fileName = file.getName();
return this.getFileSuffix(fileName);
}
/**
* 方法描述: 获取文件名
* @param filePath 文件路径
* @return
* @author icesong
*/
public String getFileName(String filePath) {
if(filePath.indexOf(":/") != -1) {
filePath = filePath.substring(filePath.lastIndexOf(File.separator) + 1);
} else if(filePath.indexOf(":\\") != -1) {
filePath = filePath.substring(filePath.lastIndexOf("\\") + 1);
}
return filePath;
}
public static void main(String[] args) throws ParseException {
String fileName = new UploadUtil().getFileName("D:\\MyFolder\\Tool\\aptana.link");
System.out.println(fileName);
}
public String getSaveDir() {
return saveDir;
}
public void setSaveDir(String saveDir) {
this.saveDir = saveDir;
}
public String getPhotoSaveDir() {
return photoSaveDir;
}
public void setPhotoSaveDir(String photoSaveDir) {
this.photoSaveDir = photoSaveDir;
}
public String getRepository() {
return repository;
}
public void setRepository(String repository) {
this.repository = repository;
}
public long getFileSizeMax() {
return fileSizeMax;
}
public void setFileSizeMax(long fileSizeMax) {
this.fileSizeMax = fileSizeMax;
}
public long getSizeMax() {
return sizeMax;
}
public void setSizeMax(long sizeMax) {
this.sizeMax = sizeMax;
}
public String getHeaderEncoding() {
return headerEncoding;
}
public void setHeaderEncoding(String headerEncoding) {
this.headerEncoding = headerEncoding;
}
public int getThresholdSize() {
return thresholdSize;
}
public void setThresholdSize(int thresholdSize) {
this.thresholdSize = thresholdSize;
}
public boolean isRandomFileName() {
return randomFileName;
}
public void setRandomFileName(boolean randomFileName) {
this.randomFileName = randomFileName;
}
public static String getUploadConfigFileName() {
return UPLOAD_CONFIG_FILE_NAME;
}
public Map<String, Object> getFormData() {
return formData;
}
public void setFormData(Map<String, Object> formData) {
this.formData = formData;
}
}
/**
* <p>
* 功能描述:读取附表配置文件
* </p>
* @author houkai
* @date 2014-4-16 下午03:31:50
* @company unisure
* @version 1.0
*/
public class PropertyReader{
/**
*
*/
private static final long serialVersionUID = -8257943425467424608L;
private static Map propertyReaderMap = new HashMap();//存储Properties对象map
/**
* 方法描述: 根据文件名获取根据键获取属性值
* @param fileNameKey 文件名不带后缀
* @param key 要获取值的键
* @return
* @author Administrator
*/
public static String getValue(String fileNameKey,String key) {
if (propertyReaderMap.get(fileNameKey) == null) {
makeInstance(fileNameKey);
}
return ((Properties)propertyReaderMap.get(fileNameKey)).getProperty(key);
}
/**
* 方法描述: 加载配置文件
* @param fileNameKey
* @author Administrator
*/
private synchronized static void makeInstance(String fileNameKey) {
if (propertyReaderMap.get(fileNameKey) == null) {
Properties properties = new Properties();
InputStream is = null;
try {
is= PropertyReader.class.getClassLoader().getResourceAsStream(fileNameKey+".properties");
properties.load(is);
propertyReaderMap.put(fileNameKey, properties);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
} finally {
try {
if(is!=null){
is.close();
}
} catch (IOException e) {
}
}
}
}
public static void main(String[] args) {
makeInstance("email");
}
private PropertyReader() {
}
}
相关推荐
Apache Commons FileUpload和Commons IO两个库是Java中处理文件上传的关键组件,它们为SpringMVC和MyBatis这样的框架提供了强大的支持。本篇文章将深入探讨这两个库以及它们在图片处理中的作用。 首先,`commons-...
在Java开发中,上传文件是一项常见的任务,而`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Apache Commons项目中的两个重要库,专门用于处理HTTP请求中的文件上传功能。这两个库为开发者提供了便捷、高效...
在开发Java应用程序,尤其是涉及到Web应用中的文件上传功能时,`commons-fileupload.jar`和`commons-io.jar`是两个至关重要的库。这两个JAR文件分别提供了Apache Commons FileUpload和Apache Commons IO项目的功能,...
`commons-fileupload-1.3.3.jar` 和 `commons-io-2.5.jar` 是Apache Commons项目中的两个重要库,它们提供了强大的文件上传功能,使得开发者可以轻松地处理用户通过表单提交的文件。 Apache Commons FileUpload是...
在这个场景中,我们关注的是"commons-fileupload-1.3.jar"和"commons-io-1.2.jar"这两个文件,它们被打包在一个名为"commons-fileupload-1.3.jar和commons-io-1.2.jar.zip"的压缩文件中。 **Apache Commons ...
commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar jar 文件。 commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar 案例上传: http://hi.baidu.com/lichao77821/blog commons-fileupload-1.2.1.jar和commons-...
Commons IO和Commons FileUpload是Java开发中两个非常重要的库,它们由Apache软件基金会提供,是许多Java项目的基础组件。 **Commons IO** `commons-io.jar` 是Apache Commons项目的一部分,它提供了大量的实用工具...
`commons-fileupload.jar` 是Apache Commons FileUpload组件的实现,它提供了一个简单而强大的API,用于处理HTTP请求中的多部分数据,也就是通常所说的表单文件上传。这个库能够解析HTTP请求,将上传的文件内容分离...
Commons FileUpload和Commons IO是Java开发中两个非常重要的库,尤其在处理文件上传功能时。这两个库由Apache软件基金会维护,是许多Java Web应用程序的标准组成部分。 `commons-fileupload-1.3.2.jar`是Apache ...
Apache Commons FileUpload与Apache Commons IO是Java开发中处理文件上传的两个重要库,它们在Web应用中被广泛使用。这两个库分别提供了不同的功能,但在处理文件上传时常常一起使用。 `commons-fileupload-1.2.1....
import org.apache.commons.fileupload.servlet.ServletFileUpload; // ... protected void doPost(HttpServletRequest request, HttpServletResponse response) { boolean isMultipart = ServletFileUpload....
import org.apache.commons.fileupload.servlet.*; import org.apache.commons.fileupload.disk.DiskFileItemFactory; public class FileUpload extends HttpServlet { private String uploadPath = ""; // 用于...
赠送jar包:commons-fileupload-1.4.jar; 赠送原API文档:commons-fileupload-1.4-javadoc.jar; 赠送源代码:commons-fileupload-1.4-sources.jar; 赠送Maven依赖信息文件:commons-fileupload-1.4.pom; 包含...
`commons-fileupload.jar` 和 `commons-io-2.6.jar` 是Apache Commons项目中的两个关键库,它们为处理文件上传提供了强大的支持。 `commons-fileupload.jar` 是Apache Commons FileUpload组件的实现,它专门用于...
标题中的"commons-fileupload-1.2.1.jar与commons-io-1.3.2.jar"涉及的是两个在Java开发中常用的开源库,主要用于处理HTTP协议上传文件的需求。这两个库在JSP(JavaServer Pages)开发中尤为重要,因为它们简化了...
描述中提到的同样为"commons-fileupload.jar",暗示我们将讨论的是一个关于文件上传处理的Java组件。这个库可以解析HTTP请求,将文件内容分离并存储为临时文件或者内存对象,以便后续的业务逻辑进行处理。 标签中的...
本教程将深入讲解如何使用Java Servlet、Apache Commons IO库(版本2.4)以及Apache Commons FileUpload库(版本1.3)来实现这一功能。 一、Apache Commons IO与FileUpload库介绍 Apache Commons IO是一个Java库,...
标题中的"commons-fileupload-1.3.3.jar"和"commons-io-1.3.2.jar"是两个在Java开发中广泛使用的开源库,分别用于处理HTTP协议下的文件上传和一般I/O操作。这两个库是由Apache软件基金会提供的,属于Apache Commons...
JSF开发所必需包:花了很长时间才收集好,很费时,现已收集好,何不分享给大家,让大家节省时间做点有意义的事情呢?呵呵。。。已在附件供大家下载,若是你所需要的东西,那就请投个票、说句鼓励的话,我就满足了。 ...
总之,`commons-fileupload-1.2.2.jar`和`commons-io-2.4.jar`是Java Web开发中处理文件上传和下载不可或缺的工具。尽管它们的版本可能不是最新的,但依然能提供可靠的功能,并且在很多现有的系统中广泛使用。理解并...