`

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

 

}

}

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics