Spring 文件操作

import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.fhzz.business.valueObject.CFileInfor;
import com.fhzz.core.util.FileUtils;

public class FileOperateUtil {

	private static Log log = LogFactory.getLog(FileOperateUtil.class);

	public static final String UPLOADDIR = "uploaddir/";

	/**
	 * 多文件上传
	 * 
	 * @param request
	 * @param fileName form表单中file的name
	 * @return 返回上传成功文件列表
	 * @throws Exception
	 */
	public static List<File> uploadFiles(HttpServletRequest request, String fileName) throws Exception {
		return upload(request, fileName, filePath(request));
	}

	/**
	 * 多文件上传
	 * 
	 * @param request
	 * @param fileName form表单中file的name
	 * @param path 上传指定的路径
	 * @return 返回上传成功文件列表
	 */
	public static List<File> upload(HttpServletRequest request, String fileName, String path) {
		List<File> mfs = new ArrayList<File>();

		if (!(request instanceof MultipartHttpServletRequest)) {
			String errorMsg = "your post form is not support ENCTYPE='multipart/form-data' ";
			log.error(errorMsg);
			throw new RuntimeException(errorMsg);
		}

		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		List<MultipartFile> multipartFiles = multipartRequest.getFiles(fileName);

		if (null != multipartFiles && multipartFiles.size() > 0) {
			for (MultipartFile mf : multipartFiles) {
				if (mf.getSize() <= 0)
					continue;

				createFile(path);
				DateFormat t = new SimpleDateFormat("yyyyMMddHHmmss");
				Date date = new Date();
				String name = t.format(date);

				char[] realName = mf.getOriginalFilename().toCharArray();
				int i = 0;
				for (i = 0; i < realName.length; i++) {
					if (realName[i] == '.')
						break;
				}
				String realPath = path + File.separator + name;
				File source = new File(realPath);
				try {
					mf.transferTo(source);
					mfs.add(source);

					log.debug("Upload file " + source.getAbsoluteFile() + " Success!");
				} catch (Exception e) {
					String errorMsg = "Upload file " + source.getAbsoluteFile() + " Error!" + e.getMessage();
					log.error(errorMsg);
					throw new RuntimeException(errorMsg);
				}
			}
		}
		return mfs;
	}
	
	/**
	 * 多文件上传(指定文件夹,保留文件名)
	 * @param request
	 * @param fileName
	 * @param path
	 * @return
	 */
	public static List<File> uploadWithFileName(HttpServletRequest request, String fieldName, String fileDir) {
		List<File> mfs = new ArrayList<File>();

		if (!(request instanceof MultipartHttpServletRequest)) {
			String errorMsg = "your post form is not support ENCTYPE='multipart/form-data' ";
			log.error(errorMsg);
			throw new RuntimeException(errorMsg);
		}

		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		List<MultipartFile> multipartFiles = multipartRequest.getFiles(fieldName);

		if (null != multipartFiles && multipartFiles.size() > 0) {
			for (MultipartFile mf : multipartFiles) {
				if (mf.getSize() <= 0)
					continue;


				String fileName = mf.getOriginalFilename();
				String realPath = StringUtils.mergeStringWithSeparator(fileDir,fileName);
				File source = new File(realPath);
				try {
					mf.transferTo(source);
					mfs.add(source);

					log.debug("Upload file " + source.getAbsoluteFile() + " Success!");
				} catch (Exception e) {
					String errorMsg = "Upload file " + source.getAbsoluteFile() + " Error!" + e.getMessage();
					log.error(errorMsg);
					throw new RuntimeException(errorMsg);
				}
			}
		}
		return mfs;
	}

	/**
	 * 多文件上传
	 * @param request
	 * @param fileName form表单中file的name
	 * @param path 上传指定的路径
	 * @return 返回上传成功文件列表
	 */
	@SuppressWarnings("unchecked")
	public static void uploadLocalFile(HttpServletRequest request, String fileName, String path, String randFlag) {
		if (!(request instanceof MultipartHttpServletRequest)) {
			String errorMsg = "your post form is not support ENCTYPE='multipart/form-data' ";
			log.error(errorMsg);
			throw new RuntimeException(errorMsg);
		}
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		List<MultipartFile> multipartFiles = multipartRequest.getFiles(fileName);
		if (null != multipartFiles && multipartFiles.size() > 0) {
			for (MultipartFile mf : multipartFiles) {
				if (mf.getSize() <= 0) {
					continue;
				}
				String realName = mf.getOriginalFilename();
				if (checkNameExists(realName, randFlag)) {
					return;
				}
				CFileInfor cfile = new CFileInfor();
				cfile.setFileName(StringUtils.replaceBlank(realName)); // 设置文件名
				ByteArrayOutputStream out = new ByteArrayOutputStream();
				try {
					BufferedImage image = ImageIO.read(mf.getInputStream());
					String formatName = FileUtils.getFileSufix(StringUtils.replaceBlank(realName));
					//ImageIO.write(image, DEFAULT_TYPE, out);
					ImageIO.write(image, formatName, out);
					byte[] b = out.toByteArray();
					cfile.setFileStream(b); // 设置文件流
					cfile.setUploadTime(new Date());
					List list = StaticValues.cacheUploadFileStream.get(randFlag);
					if (list == null || list.size() == 0) {
						list = new ArrayList();
						list.add(System.currentTimeMillis()); // 将当前时间放入
					}
					list.add(cfile);
					StaticValues.cacheUploadFileStream.put(randFlag, list);
				} catch (Exception e) {
					String errorMsg = "Upload file Error!" + e.getMessage();
					log.error(errorMsg);
					throw new RuntimeException(errorMsg);
				} finally {
					if (out != null) {
						try {
							out.close();
							out = null;
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}
	}

	/**
	 * 检验文件名是否存在
	 * 
	 * @param name
	 */
	@SuppressWarnings("unchecked")
	public static boolean checkNameExists(String fileName, String randFlag) {
		CFileInfor cfile = null;
		List list = StaticValues.cacheUploadFileStream.get(randFlag);
		if (list != null && list.size() > 1) {
			for (int i = 1; i < list.size(); i++) {
				cfile = (CFileInfor) list.get(i);
				if (cfile != null && fileName.equals(cfile.getFileName())) {
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * 文件下载 , 根据文件名下载文件
	 * 
	 * @param request
	 * @param response
	 * @param fileName
	 *            文件名
	 * @throws Exception
	 */
	public static void download(HttpServletRequest request, HttpServletResponse response, String filePath, String fileName) throws Exception {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;

		String downLoadPath = filePath + fileName;

		response.setCharacterEncoding("ISO8859-1");
		response.setContentType("APPLICATION/OCTET-STREAM");
		response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"), "ISO8859-1"));

		File f = new File(downLoadPath);
		if (!f.exists())
			throw new RuntimeException("Download file not exists! file = " + downLoadPath);

		try {
			bis = new BufferedInputStream(new FileInputStream(f));
			bos = new BufferedOutputStream(response.getOutputStream());

			byte[] buff = new byte[2048];
			int bytesRead;
			while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
				bos.write(buff, 0, bytesRead);
			}

			log.debug("Download file " + downLoadPath + " Success!");
		} catch (Exception e) {
			String errorMsg = "Download file " + downLoadPath + " Error!  " + e.getMessage();
			log.error(errorMsg);
			throw new RuntimeException(errorMsg);
		} finally {
			if (null != bis)
				bis.close();
			if (null != bos)
				bos.close();
			bis = null;
			bos = null;
		}
	}

	/**
	 * 文件上传 存储目录 临时目录
	 * 
	 * @param request
	 * @return
	 */
	public static String filePath(HttpServletRequest request) {
		String ctxPath = request.getSession().getServletContext().getRealPath("/");
		String filePath = ctxPath + FileOperateUtil.UPLOADDIR;
		return filePath;
	}

	/**
	 * 上传路径检查,不存在则创建指定文件夹
	 * 
	 * @param filePath
	 */
	public static void createFile(String filePath) {
		try {
			File f = new File(filePath);
			if (!f.exists()) {
				f.mkdir();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解析出上传文件的文件名 杨朝晖 2012.09.07
	 * 
	 * @param request
	 * @return 上传是否成功
	 * @throws Exception
	 */
	public static String extractFileName(HttpServletRequest request, String Filedata) throws Exception {
		String realPath = "";
		if (!(request instanceof MultipartHttpServletRequest)) {
			String errorMsg = "your post form is not support ENCTYPE='multipart/form-data' ";
			log.error(errorMsg);
			realPath = "";
		}
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		List<MultipartFile> multipartFiles = multipartRequest.getFiles(Filedata);
		if (null != multipartFiles && multipartFiles.size() > 0) {
			MultipartFile mf = multipartFiles.get(0);
			realPath = mf.getOriginalFilename();
		}
		return realPath;
	}

	/**
	 * 文件上传(指定文件保存路径和文件名) 杨朝晖 2012.09.07
	 * 
	 * @param request
	 * @return 上传是否成功
	 * @throws Exception
	 */
	public static File uploadFilesSpecifyFileNameAndPath(HttpServletRequest request, String filePathWithFileName, String Filedata) throws Exception {
		MultipartFile mf = null;
		File mff = null;
		if (!(request instanceof MultipartHttpServletRequest)) {
			String errorMsg = "your post form is not support ENCTYPE='multipart/form-data' ";
			log.error(errorMsg);

			throw new RuntimeException(errorMsg);
		}
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		List<MultipartFile> multipartFiles = multipartRequest.getFiles(Filedata);
		if (null != multipartFiles && multipartFiles.size() > 0) {
			mf = multipartFiles.get(0);
			String realPath = StringUtils.mergeStringWithSeparator(filePathWithFileName,mf.getOriginalFilename());
//			String realPath = filePathWithFileName;
			File source = new File(realPath);
			try {
				mf.transferTo(source);
				mff = source;
				log.debug("Upload file " + source.getAbsoluteFile() + " Success!");
			} catch (Exception e) {
				String errorMsg = "Upload file " + source.getAbsoluteFile() + " Error!" + e.getMessage();
				log.error(errorMsg);
				throw new RuntimeException(errorMsg);

			}
		}
		return mff;
	}
	
	/**
	 * 文件上传(指定文件夹,保留文件名)
	 * @param request
	 * @param fileDir 指定文件夹
	 * @param Filedata 
	 * @return
	 * @throws Exception
	 */
	public static File uploadFilesSpecifyPath(HttpServletRequest request, String fileDir, String Filedata) throws Exception {
		MultipartFile mf = null;
		File mff = null;
		if (!(request instanceof MultipartHttpServletRequest)) {
			String errorMsg = "your post form is not support ENCTYPE='multipart/form-data' ";
			log.error(errorMsg);

			throw new RuntimeException(errorMsg);
		}
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		List<MultipartFile> multipartFiles = multipartRequest.getFiles(Filedata);
		if (null != multipartFiles && multipartFiles.size() > 0) {
			mf = multipartFiles.get(0);
			String realPath = StringUtils.mergeStringWithSeparator(fileDir,mf.getOriginalFilename());
			File source = new File(realPath);
			try {
				mf.transferTo(source);
				mff = source;
				log.debug("Upload file " + source.getAbsoluteFile() + " Success!");
			} catch (Exception e) {
				String errorMsg = "Upload file " + source.getAbsoluteFile() + " Error!" + e.getMessage();
				log.error(errorMsg);
				throw new RuntimeException(errorMsg);

			}
		}
		return mff;
	}

	/**
	 * 删除目录或文件 陈子雅 2013.06.18
	 * @param sPath
	 * @return
	 */
	public static boolean deleteFolder(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 判断目录或文件是否存在
		if (!file.exists()) { // 不存在返回 false
			return flag;
		} else {
			// 判断是否为文件
			if (file.isFile()) { // 为文件时调用删除文件方法
				return deleteFile(sPath);
			} else { // 为目录时调用删除目录方法
				return deleteDirectory(sPath);
			}
		}
	}

	/**
	 * 删除单个文件
	 * 
	 * @param sPath
	 *            被删除文件的文件名
	 * @return 单个文件删除成功返回true,否则返回false
	 */
	public static boolean deleteFile(String sPath) {
		try {
			boolean flag = false;
			File file = new File(sPath);
			// 路径为文件且不为空则进行删除
			if (file.isFile() && file.exists()) {
				file.delete();
				flag = true;
			}
			return flag;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 删除目录(文件夹)以及目录下的文件
	 * 
	 * @param sPath
	 *            被删除目录的文件路径
	 * @return 目录删除成功返回true,否则返回false
	 */
	public static boolean deleteDirectory(String sPath) {
		// 如果sPath不以文件分隔符结尾,自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		// 如果dir对应的文件不存在,或者不是一个目录,则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		boolean flag = true;
		// 删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				// 删除子文件
				if (files[i].isFile()) {
					flag = deleteFile(files[i].getAbsolutePath());
					if (!flag)
						break;
				} // 删除子目录
				else {
					flag = deleteDirectory(files[i].getAbsolutePath());
					if (!flag)
						break;
				}
			}
		}
		if (!flag)
			return false;
		// 删除当前目录
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * 获取文件大小
	 * @param file
	 * @return
	 */
	public static float getFileSize(File file){
		float length = file.length();
		String format = new DecimalFormat("0.0").format(length/1048576f);
		return Float.parseFloat(format);
	}

	/**
	 * 删除目录下的文件
	 * @param appImageDir
	 */
	public static void deleteFilesInFloder(String sPath) {
		// 如果sPath不以文件分隔符结尾,自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		// 如果dir对应的文件不存在,或者不是一个目录,则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return ;
		}
		boolean flag = true;
		// 删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				// 删除子文件
				if (files[i].isFile()) {
					flag = deleteFile(files[i].getAbsolutePath());
					if (!flag)
						break;
				} // 删除子目录
				else {
					flag = deleteDirectory(files[i].getAbsolutePath());
					if (!flag)
						break;
				}
			}
		}
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值