`

jsp servlet和commons-fileupload.jar做的一上传公用组件

    博客分类:
  • JAVA
 
阅读更多

/**

 * 上传测试控制类

 * @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() {

 

}

}

 

 

 

 

分享到:
评论

相关推荐

    commons-fileupload.jar和commons-io.jar

    Apache Commons FileUpload和Commons IO两个库是Java中处理文件上传的关键组件,它们为SpringMVC和MyBatis这样的框架提供了强大的支持。本篇文章将深入探讨这两个库以及它们在图片处理中的作用。 首先,`commons-...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    在Java开发中,上传文件是一项常见的任务,而`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Apache Commons项目中的两个重要库,专门用于处理HTTP请求中的文件上传功能。这两个库为开发者提供了便捷、高效...

    commons-fileupload.jar和commons-io.jar包

    在开发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

    `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.zip

    在这个场景中,我们关注的是"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 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.jar和commons-fileupload.jar

    Commons IO和Commons FileUpload是Java开发中两个非常重要的库,它们由Apache软件基金会提供,是许多Java项目的基础组件。 **Commons IO** `commons-io.jar` 是Apache Commons项目的一部分,它提供了大量的实用工具...

    commons-fileupload.jar和commons-io-1.4.jar

    `commons-fileupload.jar` 是Apache Commons FileUpload组件的实现,它提供了一个简单而强大的API,用于处理HTTP请求中的多部分数据,也就是通常所说的表单文件上传。这个库能够解析HTTP请求,将上传的文件内容分离...

    commons-fileupload-1.3.2.jar和commons-io-2.5.jar

    Commons FileUpload和Commons IO是Java开发中两个非常重要的库,尤其在处理文件上传功能时。这两个库由Apache软件基金会维护,是许多Java Web应用程序的标准组成部分。 `commons-fileupload-1.3.2.jar`是Apache ...

    commons-fileupload-1.2.1.jar 和commons-io-1.4.jar

    Apache Commons FileUpload与Apache Commons IO是Java开发中处理文件上传的两个重要库,它们在Web应用中被广泛使用。这两个库分别提供了不同的功能,但在处理文件上传时常常一起使用。 `commons-fileupload-1.2.1....

    commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar组件

    import org.apache.commons.fileupload.servlet.ServletFileUpload; // ... protected void doPost(HttpServletRequest request, HttpServletResponse response) { boolean isMultipart = ServletFileUpload....

    commons-fileupload-1.2.jar和commons-io-1.3.2.jar

    import org.apache.commons.fileupload.servlet.*; import org.apache.commons.fileupload.disk.DiskFileItemFactory; public class FileUpload extends HttpServlet { private String uploadPath = ""; // 用于...

    commons-fileupload-1.4-API文档-中文版.zip

    赠送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; 包含...

    上传文件jar包commons-fileupload.jar和commons-io-2.6.jar

    `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

    标题中的"commons-fileupload-1.2.1.jar与commons-io-1.3.2.jar"涉及的是两个在Java开发中常用的开源库,主要用于处理HTTP协议上传文件的需求。这两个库在JSP(JavaServer Pages)开发中尤为重要,因为它们简化了...

    commons-fileupload.jar

    描述中提到的同样为"commons-fileupload.jar",暗示我们将讨论的是一个关于文件上传处理的Java组件。这个库可以解析HTTP请求,将文件内容分离并存储为临时文件或者内存对象,以便后续的业务逻辑进行处理。 标签中的...

    java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载

    本教程将深入讲解如何使用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程序文件

    标题中的"commons-fileupload-1.3.3.jar"和"commons-io-1.3.2.jar"是两个在Java开发中广泛使用的开源库,分别用于处理HTTP协议下的文件上传和一般I/O操作。这两个库是由Apache软件基金会提供的,属于Apache Commons...

    JSF开发包:commons-beanutils.jar+commons-collections.jar+commons-digester.jar+jsf-api.jar+jsf-impl.jar+jstl.jar+standard.jar

    JSF开发所必需包:花了很长时间才收集好,很费时,现已收集好,何不分享给大家,让大家节省时间做点有意义的事情呢?呵呵。。。已在附件供大家下载,若是你所需要的东西,那就请投个票、说句鼓励的话,我就满足了。 ...

    commons-fileupload-1.2.2.jar和commons-io-2.4.jar包

    总之,`commons-fileupload-1.2.2.jar`和`commons-io-2.4.jar`是Java Web开发中处理文件上传和下载不可或缺的工具。尽管它们的版本可能不是最新的,但依然能提供可靠的功能,并且在很多现有的系统中广泛使用。理解并...

Global site tag (gtag.js) - Google Analytics