涵盖所有格式通用文件上传

涵盖所有格式通用文件上传

文件允许格式
文件允许格式
private static String[] allowFiles = { ".rar", ".doc", ".docx", ".zip", ".pdf", ".txt", ".swf", ".xlsx",".xls",".ppt"
		,".gif",".png", ".jpg", ".jpeg",".bmp",".mp4", ".flv",".avi",".mpg",".wmv",".3gp", ".mov", ".asf", 
		".asx", ".vob",".wmv9", ".rm", ".rmvb",".mp3",".wma",".flac",".aac,",".mmf",".amr,",".m4a",".m4r",".ogg",".eav",".wv"};
private static String[] otherFiles = { ".rar", ".doc", ".docx", ".zip", ".pdf", ".txt", ".swf", ".xlsx",".xls",".ppt",".pptx",".psd"};
//图片格式
private static String[] picFiles = {".gif",".png", ".jpg", ".jpeg",".bmp"};
//视频格式
private static String[] vidoFiles = {".mp4", ".flv",".avi",".mpg",".wmv",".3gp", ".mov", ".asf", ".asx", ".vob",".wmv9", ".rm", ".rmvb"};
//音频格式
private static String[] audioFiles = {".mp3",".wma",".flac",".wav",".aac,",".mmf",".amr,",".m4a",".m4r",".ogg",".eav",".wv"};
// 允许转码的视频格式(ffmpeg)
private static String[] allowFLV = { ".avi", ".mpg", ".wmv", ".3gp", ".mov", ".asf", ".asx", ".vob" };
// 允许的视频转码格式(mencoder)
private static String[] allowAVI = { ".wmv9", ".rm", ".rmvb" };

代码如下(示例):

public class FileUploadTool {
 
	TransfMediaTool transfMediaTool = new TransfMediaTool();
	// 文件最大50M
	private static long upload_maxsize = 50 * 1024 * 1024;
	// 文件允许格式
	//其他文件格式
	private static String[] allowFiles = { ".rar", ".doc", ".docx", ".zip", ".pdf", ".txt", ".swf", ".xlsx",".xls",".ppt"
			,".gif",".png", ".jpg", ".jpeg",".bmp",".mp4", ".flv",".avi",".mpg",".wmv",".3gp", ".mov", ".asf", 
			".asx", ".vob",".wmv9", ".rm", ".rmvb",".mp3",".wma",".flac",".aac,",".mmf",".amr,",".m4a",".m4r",".ogg",".eav",".wv"};
	private static String[] otherFiles = { ".rar", ".doc", ".docx", ".zip", ".pdf", ".txt", ".swf", ".xlsx",".xls",".ppt",".pptx",".psd"};
	//图片格式
	private static String[] picFiles = {".gif",".png", ".jpg", ".jpeg",".bmp"};
	//视频格式
	private static String[] vidoFiles = {".mp4", ".flv",".avi",".mpg",".wmv",".3gp", ".mov", ".asf", ".asx", ".vob",".wmv9", ".rm", ".rmvb"};
	//音频格式
	private static String[] audioFiles = {".mp3",".wma",".flac",".wav",".aac,",".mmf",".amr,",".m4a",".m4r",".ogg",".eav",".wv"};
	// 允许转码的视频格式(ffmpeg)
	private static String[] allowFLV = { ".avi", ".mpg", ".wmv", ".3gp", ".mov", ".asf", ".asx", ".vob" };
	// 允许的视频转码格式(mencoder)
	private static String[] allowAVI = { ".wmv9", ".rm", ".rmvb" };

	public FileEntity createFile(MultipartFile multipartFile, HttpServletRequest request) {
		FileEntity entity = new FileEntity();
		boolean bflag = false;
		//1、图片 2视频 3音频 4其他文件  
		String fileType = "";
		String Folder = "pic";
		String fileName = multipartFile.getOriginalFilename().toString();
		// 判断文件不为空
		if (multipartFile.getSize() != 0 && !multipartFile.isEmpty()) {
			bflag = true;
			// 判断文件大小
			if (multipartFile.getSize() <= upload_maxsize) {
				bflag = true;
				// 文件类型判断
				fileType = this.checkFileType(fileName);
				if (!fileType.equals("")) {
					if (fileType.equals("picFiles")){
						Folder =  "pic";
					}
					if (fileType.equals("vidoFiles")){
						Folder =  "vidio";
					}
					if (fileType.equals("audioFiles")){
						Folder =  "audio";
					}
					if (fileType.equals("otherFiles")){
						Folder =  "fils";
					}
					bflag = true;
				} else {
					bflag = false;
					entity.setMsg("文件类型不允许");
					entity.setFlag(false);
					System.out.println("文件类型不允许");
				}
			} else {
				bflag = false;
				entity.setMsg("文件大小超范围");
				entity.setFlag(false);
				System.out.println("文件大小超范围");
			}
		} else {
			bflag = false;
			entity.setMsg("文件为空");
			entity.setFlag(false);
			System.out.println("文件为空");
		}
		if (bflag) {
			String logoPathDir = "/FileUpload/"+Folder+"/"+ DateUtil.dateToStr(new Date(), 2);
			String logoRealPathDir = JeePlusProperites.newInstance().getUserfilesBaseDir();
			logoRealPathDir = logoRealPathDir + logoPathDir;
			File logoSaveFile = new File(logoRealPathDir);
			if (!logoSaveFile.exists()) {
				logoSaveFile.mkdirs();
			}
			String name = fileName.substring(0, fileName.lastIndexOf("."));
			System.out.println("文件名称:" + name);
			// 新的文件名 --上传后的文件名称
			String newFileName = StringHelper.GetGUID();
			// 文件扩展名
			String fileEnd = this.getFileExt(fileName);
			// 绝对路径 -- 原图的文件地址
			String fileNamedirs = logoRealPathDir + File.separator + newFileName + fileEnd;
//			//压缩后的 名称
//			String newFileName1 = StringHelper.GetGUID();
			//压缩后的地址
			String compressPath = logoRealPathDir + File.separator + newFileName + fileEnd;
			System.out.println("保存的绝对路径:" + fileNamedirs);
			File filedirs = new File(fileNamedirs);
			// 转入文件
			try {
				multipartFile.transferTo(filedirs);
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (fileEnd.equals(".jpg") || fileEnd.equals(".png") || fileEnd.equals(".jpeg")){
				int Width = getImgWidth(filedirs);
				int Height = getImgHeight(filedirs);
				System.out.println("图片的宽是:"+Width+",高是:"+Height);
				commpressPicForScale(fileNamedirs, compressPath, 500, 0.8, Width, Height);
			}
			// 相对路径
			entity.setType(fileEnd);
			String fileDir = logoPathDir +"/"+ newFileName + fileEnd;
			//压缩后的图片 相对路径
			String compressDir = logoPathDir +"/"+ newFileName + fileEnd;
//			StringBuilder builder = new StringBuilder(fileDir);
			String finalFileDir = fileDir;
			// size存储为String
			String size = this.getSize(filedirs);
			// 源文件保存路径
			String aviPath = filedirs.getAbsolutePath();
			// 转码Avi
			// boolean flag = false;
			if (this.checkAVIType(fileEnd)) {
				// 设置转换为AVI格式后文件的保存路径
				String codcAviPath = logoRealPathDir + File.separator + newFileName + ".avi";
				// 获取配置的转换工具(mencoder.exe)的存放路径
				String mencoderPath = request.getSession().getServletContext().getRealPath("/tools/mencoder.exe");
				aviPath = transfMediaTool.processAVI(mencoderPath, filedirs.getAbsolutePath(), codcAviPath);
				fileEnd = this.getFileExt(codcAviPath);
			}
			if (aviPath != null) {
				// 转码Flv
				if (this.checkMediaType(fileEnd)) {
					try {
						// 设置转换为flv格式后文件的保存路径
						String codcFilePath = logoRealPathDir + File.separator + newFileName + ".flv";
						// 获取配置的转换工具(ffmpeg.exe)的存放路径
						String ffmpegPath = request.getSession().getServletContext().getRealPath("/tools/ffmpeg.exe");
						transfMediaTool.processFLV(ffmpegPath, aviPath, codcFilePath);
						fileEnd = ".flv";
						fileDir = logoPathDir +"/"+ newFileName + ".flv";
//						builder = new StringBuilder(fileDir);
						finalFileDir = fileDir;
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				entity.setFileName(fileName);
				entity.setFileType(fileType);
				entity.setSize(size);
				entity.setPath(finalFileDir);//原图路径
				entity.setCompressDir(compressDir);//压缩后的路径
				entity.setTitleOrig(name);
				entity.setTitleAlter(newFileName+fileEnd);
				Timestamp timestamp = new Timestamp(System.currentTimeMillis());
				entity.setUploadTime(timestamp);
				return entity;
			} else {
				return entity;
			}
		} else {
			return entity;
		}

	}

	/**
	 * 文件类型判断
	 *
	 * @param fileName
	 * @return
	 */
	private String checkFileType(String fileName) {
		String fileType = "";
		Iterator<String> type = Arrays.asList(otherFiles).iterator();
		while (type.hasNext()) {
			String ext = type.next();
			System.out.println(ext);
			if (fileName.toLowerCase().endsWith(ext)) {
				fileType = "4";
				return fileType;
			}
		}
		Iterator<String> type1 = Arrays.asList(picFiles).iterator();
		while (type1.hasNext()) {
			String ext = type1.next();
			System.out.println(ext);
			if (fileName.toLowerCase().endsWith(ext)) {
				fileType = "1";
				return fileType;
			}
		}
		Iterator<String> type2 = Arrays.asList(vidoFiles).iterator();
		while (type2.hasNext()) {
			String ext = type2.next();
			System.out.println(ext);
			if (fileName.toLowerCase().endsWith(ext)) {
				fileType = "2";
				return fileType;
			}
		}
		Iterator<String> type3 = Arrays.asList(audioFiles).iterator();
		while (type3.hasNext()) {
			String ext = type3.next();
			System.out.println(ext);
			if (fileName.toLowerCase().endsWith(ext)) {
				fileType = "3";
				return fileType;
			}
		}
		return fileType;
	}

	/**
	 * 视频类型判断(flv)
	 *
	 * @param fileEnd
	 * @return
	 */
	private boolean checkMediaType(String fileEnd) {
		Iterator<String> type = Arrays.asList(allowFLV).iterator();
		while (type.hasNext()) {
			String ext = type.next();
			if (fileEnd.equals(ext)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 视频类型判断(AVI)
	 *
	 * @param fileEnd
	 * @return
	 */
	private boolean checkAVIType(String fileEnd) {
		Iterator<String> type = Arrays.asList(allowAVI).iterator();
		while (type.hasNext()) {
			String ext = type.next();
			if (fileEnd.equals(ext)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 获取文件扩展名
	 *
	 * @return string
	 */
	private String getFileExt(String fileName) {
		return fileName.substring(fileName.lastIndexOf("."));
	}

	/**
	 * 依据原始文件名生成新文件名
	 * 
	 * @return
	 */
	private String getName(String fileName) {
		Iterator<String> type = Arrays.asList(allowFiles).iterator();
		while (type.hasNext()) {
			String ext = type.next();
			if (fileName.contains(ext)) {
				String newFileName = fileName.substring(0, fileName.lastIndexOf(ext));
				return newFileName;
			}
		}
		return "";
	}

	/**
	 * 文件大小,返回kb.mb
	 *
	 * @return
	 */
	private String getSize(File file) {
		String size = "";
		long fileLength = file.length();
		DecimalFormat df = new DecimalFormat("#.00");
		if (fileLength < 1024) {
			size = df.format((double) fileLength) + "BT";
		} else if (fileLength < 1048576) {
			size = df.format((double) fileLength / 1024) + "KB";
		} else if (fileLength < 1073741824) {
			size = df.format((double) fileLength / 1048576) + "MB";
		} else {
			size = df.format((double) fileLength / 1073741824) + "GB";
		}
		return size;
	}


	
	/**
     * Get the Mime Type from a File
     * @param fileName 文件名
     * @return 返回MIME类型
     * thx https://www.oschina.net/question/571282_223549
     * add by fengwenhua 2017年5月3日09:55:01
     */
    public static String getMimeType(String fileName) {
        FileNameMap fileNameMap = URLConnection.getFileNameMap();
        String type = fileNameMap.getContentTypeFor(fileName);
        return type;
    }
    
    public boolean delAttach(String AttachPath,HttpServletRequest request){
    	String logoRealPathDir = JeePlusProperites.newInstance().getUserfilesBaseDir();
		String filePath = logoRealPathDir + AttachPath;
		File fileTemp = new File(filePath);
		// 判断文件是否存在
		boolean falg = false;
		falg = fileTemp.exists();
		if (falg) {
			if (true == fileTemp.isFile()) {
				boolean flag = false;
				flag = fileTemp.delete();
				if (flag) {
					System.out.println("删除成功!");
					return true;
				}
			} else {
				System.out.println("不是文件!");
				return false;
			}
		} else {
			System.out.println("文件不存在!");
			return false;
		}
		return false;
    }
    
    //图片压缩
    public static String thumbnailFile (String filePath,MultipartFile imageFile) {
    	 if(filePath.contains(".png")){
    		 filePath = filePath.replace(".png", ".jpg");
         }
         long size = imageFile.getSize();
         double scale = 1.0d ;
         if(size >= 200*1024){
             if(size > 0){
            	 if(size >= 200*1024 && size < 500*1024){//小于500K的时候
                     scale = 0.9f ;             
                 }
                 if(size >= 500*1024 && size < 800*1024){//小于800K的时候
                     scale = 0.8f ;             
                 }
                 if(size >= 800*1024 && size < 1 *1024 * 1024){//小于1M的时候
                     scale = 0.7f ;             
                 }
                 if(size >= 1 *1024 * 1024 && size < 2 *1024 * 1024){//小于2M的时候
                     scale = 0.6f ;             
                 }
                 if(size >= 2 *1024 * 1024 && size < 3 *1024 * 1024){//小于3M的时候
                     scale = 0.5f ;             
                 }
                 if(size >= 3 *1024 * 1024 && size < 5 *1024 * 1024){//小于3M的时候
                     scale = 0.4f ;             
                 }
                 if(size >= 5 *1024 * 1024){//大于等于5M的时候
                     scale = 0.3f ;             
                 }
             }
             System.out.println("压缩比例为为:"+scale);
         }
         try {
             if(size < 200*1024){
                 Thumbnails.of(filePath).scale(1f).outputFormat("jpg").toFile(filePath);
             }else{
                 Thumbnails.of(filePath).scale(1f).outputQuality(scale).outputFormat("jpg").toFile(filePath);
             }
         } catch (Exception e1) {
        	 
         }
        return filePath;
    }
    
    /**
     * 根据指定大小和指定精度压缩图片
     * 
     * @param srcPath
     *            源图片地址
     * @param desPath
     *            目标图片地址
     * @param desFileSize
     *            指定图片大小,单位kb
     * @param accuracy
     *            精度,递归压缩的比率,建议小于0.9
    *  @param desMaxWidth
    *             目标最大宽度
    *  @param desMaxHeight
    *             目标最大高度
     * @return 目标文件路径
     */
   public static String commpressPicForScale(String srcPath, String desPath,
           long desFileSize, double accuracy,int desMaxWidth,int desMaxHeight) {
       if (StringHelper.IsEmptyOrNull(srcPath) || StringHelper.IsEmptyOrNull(srcPath)) {
           return null;
       }
       if (!new File(srcPath).exists()) {
           return null;
       }
       try {
           File srcFile = new File(srcPath);
           long srcFileSize = srcFile.length();
           System.out.println("源图片:" + srcPath + ",大小:" + srcFileSize / 1024
                                       + "kb");
           //获取图片信息
           BufferedImage bim = ImageIO.read(srcFile);
           int srcWidth = bim.getWidth();
           int srcHeight = bim.getHeight();

           //先转换成jpg
           Thumbnails.Builder builder = Thumbnails.of(srcFile).outputFormat("jpg");

           // 指定大小(宽或高超出会才会被缩放)
           if(srcWidth > desMaxWidth || srcHeight > desMaxHeight) {
               builder.size(desMaxWidth, desMaxHeight);
           }else{
               //宽高均小,指定原大小
               builder.size(srcWidth,srcHeight);
           }

           // 写入到内存
           ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
           builder.toOutputStream(baos);

           // 递归压缩,直到目标文件大小小于desFileSize
           byte[] bytes = commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);

           // 输出到文件
           File desFile = new File(desPath);
           FileOutputStream fos = new FileOutputStream(desFile);
           fos.write(bytes);
           fos.close();

           System.out.println("目标图片:" + desPath + ",大小" + desFile.length() / 1024 + "kb");
           System.out.println("图片压缩完成!");
       } catch (Exception e) {
           e.printStackTrace();
           return null;
       }
       return desPath;
   }

   private static byte[] commpressPicCycle(byte[] bytes, long desFileSize, double accuracy) throws IOException {
      // File srcFileJPG = new File(desPath);
       long srcFileSizeJPG = bytes.length;
       // 2、判断大小,如果小于500kb,不压缩;如果大于等于500kb,压缩
       if (srcFileSizeJPG <= desFileSize * 1024) {
           return bytes;
       }
       // 计算宽高
       BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes));
       int srcWdith = bim.getWidth();
       int srcHeigth = bim.getHeight();
       int desWidth = new BigDecimal(srcWdith).multiply(
                               new BigDecimal(accuracy)).intValue();
       int desHeight = new BigDecimal(srcHeigth).multiply(
                               new BigDecimal(accuracy)).intValue();

       ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
       Thumbnails.of(new ByteArrayInputStream(bytes)).size(desWidth, desHeight).outputQuality(accuracy).toOutputStream(baos);
       return commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);
   }
   
   /**
    * 获取图片宽度
    * @param file  图片文件
    * @return 宽度
    */
   public static int getImgWidth(File file) {
       InputStream is = null;
       BufferedImage src = null;
       int ret = -1;
       try {
           is = new FileInputStream(file);
           src = ImageIO.read(is);
           ret = src.getWidth(null); // 得到源图宽
           is.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
       return ret;
   }
     
     
   /**
    * 获取图片高度
    * @param file  图片文件
    * @return 高度
    */
   public static int getImgHeight(File file) {
       InputStream is = null;
       BufferedImage src = null;
       int ret = -1;
       try {
           is = new FileInputStream(file);
           src = ImageIO.read(is);
           ret = src.getHeight(null); // 得到源图高
           is.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
       return ret;
   }


}

总结

各种格式文件上传下载,删除,压缩。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值