package com.pqs.common.tools;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
public class Upload {
private static Logger log = LoggerFactory.getLogger(Upload.class);
private static final int BUFFER_SIZE = 16 * 1024 ;
public void upload(File f,String fileName){
try {
//创建读取流
FileInputStream fin = new FileInputStream(f);
String files = Thread.currentThread().getContextClassLoader().getResource("/").getPath()+"upload/";
//创建输入流
File fe = new File(files+fileName);
FileOutputStream fout = new FileOutputStream(fe);
//一边读取,一边写入
byte data[] = new byte[1024];
int count = 0;
while((count=fin.read(data))!=-1){
fout.write(data, 0, count);
}
//关闭流
fin.close();
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 图片上传方法
* @param f 文件
* @param fName 图片名称
* @param paperFileName 文件夹名称
* @return
*/
public final static String uploadImg(HttpServletRequest request, MultipartFile f, String fName, String paperFileName){
if(null != f && null!=fName) {
String imageFileName = new Date().getTime() + getExtention(fName);// 生成处理后在图片名称
String filedir = request.getSession().getServletContext().getRealPath("/") + "uploads/"
+"/"+paperFileName;
File dir = new File(filedir);
if (!dir.exists()) //如果目录不存在就创建目录
dir.mkdirs();
File imageFile = new File(filedir + "/" + imageFileName);
try {
copyFile(f, imageFile);
} catch (Exception e) {
e.printStackTrace();
}
return "uploads/"+paperFileName+"/"+imageFileName; //新生成的图片路径名称
}
return null;
}
//截取图片名字
private static String getExtention(String fileName) {
int pos = fileName.lastIndexOf( "." );
return fileName.substring(pos);
}
//存入图片
private static void copyFile(MultipartFile imgFile, File dst) throws IOException {
imgFile.transferTo(dst); //保存上传的文件
}
/**
* 保存文件
* @param f 文件
* @param fName 文件名称
* @param paperFileName 文件夹名称
* @return
*/
public final static String uploadFile(HttpServletRequest request, MultipartFile f, String fName, String paperFileName){
if(f.getSize()!=0 &&!("").equals(fName) && null!=f && null!=fName){
String filedir = request.getSession().getServletContext().getRealPath("/") + "uploads/"+paperFileName;
File dir = new File(filedir);
if (!dir.exists()) //如果目录不存在就创建目录
dir.mkdirs();
File accessoryFile = new File(filedir + "/" + fName); //NEW一个文件对象
try {
copyFile(f, accessoryFile); //拷贝上传的文件对象
} catch (Exception e) {
e.printStackTrace();
}
return "uploads/"+paperFileName+"/"+fName; //新生成的图片路径名称
}
return null;
}
/******************************************************************************************************************/
/**
* 删除文件
* @param fName 文件名称
* @param paperFileName 文件夹名称
* @return
*/
public final static boolean deleteFileOrDirectory(HttpServletRequest request, String fName, String paperFileName){
//文件路径
String filedir = request.getSession().getServletContext().getRealPath("/") + "uploads/"+paperFileName+"/"+fName;
//文件夹
String directorydir = request.getSession().getServletContext().getRealPath("/") + "uploads/"+paperFileName;
//保存文件 文件夹路径
String rootPath = request.getSession().getServletContext().getRealPath("/") + "uploads";
File file = new File(filedir);
if (!file.exists()) {
//"删除文件失败:"+fName+"文件不存在";
return false;
}else{
//删除所有空文件夹
List<File> list = getAllNullDirectorys(new File(rootPath));
removeNullFile(list, rootPath);
if(file.isFile()){
return deleteFile(filedir); //删除单个文件
}else{
return deleteDirectory(directorydir); //删除目录(文件夹)以及目录下的文件
}
}
}
/**
* 删除单个文件
* @param fileName 被删除文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
public static boolean deleteFile(String fileName){
File file = new File(fileName);
if (file.isFile() && file.exists()) {
file.delete();//"删除单个文件"+name+"成功!"
return true;
}//"删除单个文件"+name+"失败!"
return false;
}
/**
* 删除目录(文件夹)以及目录下的文件
* @param dir 被删除目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(String directorydir){
//如果dir不以文件分隔符结尾,自动添加文件分隔符
if(!directorydir.endsWith(File.separator)){
directorydir = directorydir+File.separator;
}
File dirFile = new File(directorydir);
//如果dir对应的文件不存在,或者不是一个目录,则退出
if(!dirFile.exists() || !dirFile.isDirectory()){
//"删除目录失败"+name+"目录不存在!"
return false;
}
boolean flag = true;
//删除文件夹下的所有文件(包括子目录)
File[] files = dirFile.listFiles();
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){
//System.out.println("删除目录失败");
return false;
}
//删除当前目录
if(dirFile.delete()){
//System.out.println("删除目录"+directorydir+"成功!");
return true;
}else{
//System.out.println("删除目录"+directorydir+"失败!");
return false;
}
}
//删除文件夹 folderPath 文件夹完整绝对路径
public static void delFolder(String folderPath) {
try {
delAllFile(folderPath); //删除完里面所有内容
String filePath = folderPath;
filePath = filePath.toString();
java.io.File myFilePath = new java.io.File(filePath);
myFilePath.delete(); //删除空文件夹
} catch (Exception e) {
e.printStackTrace();
}
}
//删除指定文件夹下所有文件 path 文件夹完整绝对路径
public static boolean delAllFile(String path) {
boolean flag = false;
File file = new File(path);
if (!file.exists()) {
return flag;
}
if (!file.isDirectory()) {//判断该路径是否是一个目录
return flag;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (path.endsWith(File.separator)) {
temp = new File(path + tempList[i]);
} else {
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
delAllFile(path + "/" + tempList[i]);//先删除文件夹里面的文件
delFolder(path + "/" + tempList[i]);//再删除空文件夹
flag = true;
}
}
return flag;
}
/*public static void main(String[] args) {
//String fileName = "g:/temp/xwz.txt";
//DeleteFileUtil.deleteFile(fileName);
String fileDir = "D:\\apache-tomcat-6.0.18\\webapps\\cyfy\\upload\\disk\\1245117448156\\JavaScript486.rar";
//DeleteFileUtil.deleteDirectory(fileDir);
DeleteFileUtil.delete(fileDir);
DeleteFileUtil t = new DeleteFileUtil();
delFolder("c:/bb");
System.out.println("deleted");
} */
/******************************************************************************************************************/
//删除指定路径下所有空文件夹
public static void main(String[] args) {
//要删除的目录 请勿以\\结尾,及最后一层目录后的分隔符不要
String rootPath = "D:\\UsersMyEclipse10Space\\JYCRM\\WebRoot\\uploads";
List<File> list = getAllNullDirectorys(new File(rootPath));
//System.out.println("---------------" + list.size());
/*for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getPath());
}*/
removeNullFile(list, rootPath);
}
/**
* 递归列出某文件夹下的最深层的空文件夹绝对路径,储存至list
*
* @param root
* @return
*/
public static List<File> getAllNullDirectorys(File root) {
List<File> list = new ArrayList<File>();
File[] dirs = root.listFiles();
if (dirs != null) {
for (int i = 0; i < dirs.length; i++) {
if (dirs[i].isDirectory() && dirs[i].listFiles().length == 0) {
//System.out.println("name:" + dirs[i].getPath());
list.add(dirs[i]);
}
if(dirs[i].isFile()){
//System.out.println("文件:"+dirs[i].getPath());
}
list.addAll(getAllNullDirectorys(dirs[i]));
}
}
return list;
}
/**
* 由最深一层的空文件,向上(父文件夹)递归,删除空文件夹
* @param list
* @param rootPath
*/
public static void removeNullFile(List<File> list, String rootPath) {
if (list==null||list.size()==0) {
return;
}
List<File> plist = new ArrayList<File>();
for (int i = 0; i < list.size(); i++) {
File temp = list.get(i);
if (temp.isDirectory() && temp.listFiles().length <= 0 ) {
temp.delete();
//System.out.println("parent:" + temp.getParentFile().getPath());
File pFile = temp.getParentFile();
if (pFile.getPath().equals(rootPath)) {
continue;
}
if (!plist.contains(pFile)) {//父目录去重添加
plist.add(pFile);
}
}
}
removeNullFile(plist, rootPath);
}
/**
* 下载
* @author geloin
* @date 2012-5-5 下午12:25:39
* @param request
* @param response
* @param storeName 下载的文件名称(下载文件路径)
* @param contentType
* @param realName 下载后需要显示的文件名称
* @throws Exception
*/
public static void download(HttpServletRequest request, HttpServletResponse response, String storeName,
String contentType, String realName) throws Exception {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
String ctxPath = request.getSession().getServletContext().getRealPath("/")+ "uploads/";
String downLoadPath = ctxPath + storeName;
long fileLength = new File(downLoadPath).length();
response.setContentType(contentType);
response.setHeader("Content-disposition", "attachment; filename="
+ new String(realName.getBytes("gb2312"), "ISO-8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength));
bis = new BufferedInputStream(new FileInputStream(downLoadPath));
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);
}
bis.close();
bos.close();
}
}