package com.nova.sankuai.infra.utils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import sun.misc.BASE64Encoder; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author weikangdi */ @Component public class ImageUtil { @Value("${upload.path}") private String path; @Value("${upload.publicPath}") private String publicPath; public String uploadFile(MultipartFile file, boolean isPublic) throws Exception { // 文件名 String fileName = file.getOriginalFilename(); // 后缀名 String suffixName = fileName.substring(fileName.lastIndexOf(".")); // 上传后的路径 String filePath = isPublic ? publicPath : path; String fileUrl = isPublic ? "/public/upload_img/" : "/upload_img/"; filePath = chooseOnTime(filePath); fileUrl = chooseOnTime(fileUrl); // 新文件名 fileName = UUID.randomUUID().toString().replace("-", "") + suffixName; File dest = new File(filePath + fileName); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } file.transferTo(dest); String filename = fileUrl + fileName; return filename; } public String uploadFileByInputStream(InputStream inputStream, boolean isPublic) throws Exception { // 上传后的路径 String filePath = isPublic ? publicPath : path; String fileUrl = isPublic ? "/public/upload_img/" : "/upload_img/"; filePath = chooseOnTime(filePath); fileUrl = chooseOnTime(fileUrl); // 文件名 String fileName = UUID.randomUUID().toString().replace("-", "") + ".png"; File dest = new File(filePath + fileName); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } byte[] data = new byte[1024]; int len = 0; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(dest); while ((len = inputStream.read(data)) != -1) { fileOutputStream.write(data, 0, len); } } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } String filename = fileUrl + fileName; return filename; } public String yxUploadFile(MultipartFile file, boolean isPublic) throws IOException { // 文件名 String fileName = ""; // 上传后的路径 String filePath = isPublic ? publicPath : path; String fileUrl = isPublic ? "/public/upload_img/" : "/upload_img/"; filePath = chooseOnTime(filePath); fileUrl = chooseOnTime(fileUrl); // 新文件名 fileName = UUID.randomUUID().toString().replace("-", "") + ".png"; File dest = new File(filePath + fileName); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } file.transferTo(dest); String filename = fileUrl + fileName; return filename; } public String uploadBase64File(byte[] imageByte, boolean isPublic) throws IOException { String fileName = UUID.randomUUID().toString().replace("-", "") + ".png"; // 上传后的路径 String filePath = isPublic ? publicPath : path; String fileUrl = isPublic ? "/public/upload_img/" : "/upload_img/"; filePath = chooseOnTime(filePath); fileUrl = chooseOnTime(fileUrl); File dest = new File(filePath + fileName); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } // 生成文件 if (!dest.exists()) { dest.createNewFile(); } OutputStream imageStream = new FileOutputStream(dest); imageStream.write(imageByte); imageStream.flush(); imageStream.close(); String filename = fileUrl + fileName; return filename; } /** * 判断上传文件大小方法 * * @param len 文件长度 * @param size 限制大小 * @return */ public static boolean checkFileSize(Long len, int size) { double fileSize = 0; fileSize = (double) len / 1048576; if (fileSize > size) { return false; } return true; } public static String chooseOnTime(String path) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String format = sdf.format(new Date()); return path + format + "/"; } /** * URL图片转base64 * @param imgUrl * @return */ public static String imageUrlToBase64(String imgUrl) { URL url = null; InputStream is = null; ByteArrayOutputStream outStream = null; HttpURLConnection httpUrl = null; try { url = new URL(imgUrl); httpUrl = (HttpURLConnection) url.openConnection(); httpUrl.connect(); httpUrl.getInputStream(); is = httpUrl.getInputStream(); outStream = new ByteArrayOutputStream(); //创建一个Buffer字符串 byte[] buffer = new byte[1024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 int len = 0; //使用输入流从buffer里把数据读取出来 while( (len = is.read(buffer)) != -1 ){ //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 outStream.write(buffer, 0, len); } // 对字节数组Base64编码 return encode(outStream.toByteArray()); } catch (Exception e) { e.printStackTrace(); } finally { try { if(is != null) { is.close(); } if(outStream != null) { outStream.close(); } if(httpUrl != null) { httpUrl.disconnect(); } } catch (Exception e) { e.printStackTrace(); } } return null; } /** * 图片转字符串 * @param image 图片Buffer * @return Base64编码 */ public static String encode(byte[] image){ BASE64Encoder decoder = new BASE64Encoder(); return replaceEnter(decoder.encode(image)); } /** * 字符替换 * @param str 字符串 * @return 替换后的字符串 */ public static String replaceEnter(String str){ String reg ="[\n-\r]"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str); return m.replaceAll(""); } }