//上传图片文件视频工具类
package com.javajy.util;
import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.framework.frext.util.Ajax;
 import org.framework.frext.util.FileUtil;public class FileUploadUtil {
// //1.可以利用Spring的@PropertySource和@Value两个注解从配置文件properties中读取值
 // private @Value("#{property['base64FileHandler.host']}") String host;  //2.服务器地址
   public static String host ="http://localhost:8080/项目图片文件名/";//读取服务器的访问地址
   public static String rootPath= "C://apache-tomcat-8.5.32/webapps/项目图片文件名/";//服务器存放图片的地址(与项目同级) //请求,响应,抛出异常
 public static Map<String, Object> saveCapture(HttpServletRequest request,HttpServletResponse response) throws Exception {//用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件
 response.setContentType("text/html;charset=utf-8");
 //存放其他非文件参数
 Map<String,Object> resultParam = new HashMap<String,Object>();

 String resultfilepath ="" ;//文件路径
 List<String> resultList  = new ArrayList<String>();//文件路径数组
 //设置时间编码格式
 SimpleDateFormat f = new SimpleDateFormat("/yyyy/MM/dd/");
 //根据服务器路径生成文件格式
 File file = new File(rootPath);
 // 判断上传文件和文件目录是否存在
 if (!file.exists() && !file.isDirectory()) {
       System.out.println("目录不存在,需要创建");
 // 创建目录
 //.mkdirs() 建立多级文件夹
       boolean isOk = file.mkdirs(); // 原来 file.mkdir();只能建一级的文件夹会形成找不到文件返回false
       System.out.println(isOk);
 }
 // 消息提示
 String message = "";
 try {
      // 使用Apache文件上传组件处理文件上传步骤:
      // 1、创建一个DiskFileItemFactory工厂,设置缓冲区大小和临时文件目录
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // 2、创建一个文件上传解析器
      ServletFileUpload upload = new ServletFileUpload(factory);
      // 3.设置上传文件名编码格式
      upload.setHeaderEncoding("UTF-8");
     // 4、使用ServletFileUpload.parseRequest解析器解析上传数据,解析结果返回的是一个所有上传内容List<FileItem>集合,每 一个FileItem对应一个Form表单的输入项
      List<FileItem> list = upload.parseRequest(request);
      for (FileItem item : list) {
            //isFormField()方法判断某项是否是普通的表单类型。
            // 如果FileItem中封装的是普通输入项的数据
      if (item.isFormField()) {
            String name = item.getFieldName();
            // 解决普通输入项的数据的中文乱码问题
            String value = item.getString("UTF-8");
            System.out.println(name + "=" + value);
            resultParam.put(name, value);
       } else {
 //否则该表单项是file 类型的
 // 得到上传的文件名称,
      String filename = item.getName();
      System.out.println(filename);
      if (filename == null || filename.trim().equals("")) {
          continue;
      }
 // 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
 // c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
 // 处理获取到的上传文件的文件的路径部分,只保留文件名部分
 filename = filename.substring(filename.lastIndexOf("\\") + 1);//lastIndexOf最后出现的位置
 // 获取item中的上传文件的输入流
 InputStream in = item.getInputStream();
 //传到远程服务器上文件名(自定义不可重复).
 filename= new Date().getTime()+new Random().nextInt(100000)+
                             "."+FileUtil.getExtensionName(filename);//适用所有文件格式(视频)
 //设置图片文件名只png图片格式 ".png";
 //filename= FileUtil.getFileNameNoEx(filename)+"_"+ DateUtils.toShortDateTime(new Date())+
 //   ".png";
 //创建一个文件输出流  保存到服务器 rootPath :服务器储存图片路径/项目本地储存图片路径
 FileOutputStream out = new FileOutputStream(rootPath + filename);
 resultfilepath = FileUploadUtil.host+filename ;//数据库存的路径用来前端读取(原图)
 //resultList.add(resultfilepath);//保存返回路径
 // 创建一个缓冲区
 byte buffer[] = new byte[1024];
 // 判断输入流中的数据是否已经读完的标识
 int len = 0;
 // 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
 while ((len = in.read(buffer)) > 0) {
 // 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\"
 // + filename)当中
 out.write(buffer, 0, len);
 }
 //关闭输入流
 in.close();
 //关闭输出流
 out.close();
 // 删除处理文件上传时生成的临时文件
 item.delete();
 message = "文件上传成功!";//如果你的手机上传的高清图片过大,可以用下面的方法进行压缩()
//判断图片上传格式是图片进行压缩
                     if(("png").equals(FileUtil.getExtensionName(filename))  || ("jpg").equals(FileUtil.getExtensionName(filename))
                             || ("jpeg").equals(FileUtil.getExtensionName(filename)) || ("gif").equals(FileUtil.getExtensionName(filename))
                             || ("psd").equals(FileUtil.getExtensionName(filename)) || ("tiff").equals(FileUtil.getExtensionName(filename))
                             || ("tga").equals(FileUtil.getExtensionName(filename)) || ("eps").equals(FileUtil.getExtensionName(filename))                               || ("bmp").equals(FileUtil.getExtensionName(filename))){                        String yasuofilename =  new Date().getTime()+"_"+new Random().nextInt(100000) +"yasuo"+
                                 "."+FileUtil.getExtensionName(filename);//定义压缩图片的名称(不能重复)            //调用图片压缩方法,获取压缩后的服务器图片路径
                         String yasopath  = YasuoUtil.scaleNormal(rootPath + filename,rootPath + yasuofilename);//调用阿里图片压缩方法
                         resultfilepath = host+ yasopath.substring(yasopath.lastIndexOf("/") + 1);//重新定义读取服务器压缩图片的地址
                     }     resultList.add(resultfilepath);//返回图片路径地址
 }
 }
 } catch (Exception e) {
 message = "文件上传失败!";
 e.printStackTrace();
 }
 System.out.println(message);
 System.out.println(resultList);
 if(resultParam.size()<1){//判断是否有普通数据
 return Ajax.getSuccessReturnMapWithData(resultList);
 }
 Map<String,Object> result = new HashMap<String,Object>();
 result.put("param", resultParam);//返回普通数据
 result.put("images", resultList);//返回String文件路径
 return result;
 }
 }