package com.ruoyi.common.qiniu; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; import com.ruoyi.common.utils.StringUtils; import net.coobird.thumbnailator.Thumbnails; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.*; import java.math.BigInteger; import java.security.MessageDigest; /** * 七牛云文件存储服务 * @author Wzp */ @Component public class QiNiuUploadUtils { private final Logger logger = LoggerFactory.getLogger(this.getClass()); /** 磁盘图片配置 */ @Resource private QiNiuConfig qiNiuConfig; /** 上传对象 */ private UploadManager uploadManager; /** 上传凭证 */ private Auth auth; // /** // * 初始化上传对象 // */ // protected void init(){ // //构造一个带指定 Region 对象的配置类 // Configuration cfg = new Configuration(Region.huanan()); // // 指定分片上传版本 // cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2; // this.uploadManager = new UploadManager(cfg); // // 获取token凭证对象 // this.auth = Auth.create(qiNiuConfig.getAccessKey(), qiNiuConfig.getSecretKey()); // } /** * 上传字节数组 * @param uploadBytes 字节数组数据 * @return 结果 */ public String uploadByte(byte[] uploadBytes, String key){ String fileUrl = ""; File outputFile = new File(qiNiuConfig.getImgFolderUrl()+"/"+key); try (FileOutputStream fos = new FileOutputStream(outputFile)) { fos.write(uploadBytes); } catch (IOException e) { e.printStackTrace(); logger.error(e.getMessage()); }finally { fileUrl = qiNiuConfig.getLocalBaseUrl()+key; return fileUrl; } } /** * 数据流上传 * @param inputStream 数据流 * @return 结果 */ public String uploadInputStream(InputStream inputStream,String key) { String url = ""; File outputFile = new File(qiNiuConfig.getImgFolderUrl()+"/"+key); try (FileOutputStream outputStream = new FileOutputStream(outputFile)) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } catch (FileNotFoundException e) { logger.error(e.getMessage()); throw new RuntimeException(e); } catch (IOException e) { logger.error(e.getMessage()); throw new RuntimeException(e); }finally { url = qiNiuConfig.getLocalBaseUrl()+key; return url; } } /** * 获取文件上传名称 * @param file 文件 * @return 结果 */ public String getFileUploadName(MultipartFile file){ // 上传文件名 String fileName = ""; try { // 文件真实名称 String originalFilename = file.getOriginalFilename(); if (StringUtils.isNotBlank(originalFilename)){ // 获取后缀名 String substring = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); // 获取文件hash值 String s = md5HashCode(file.getInputStream()); fileName = s+"."+substring; } } catch (IOException e) { e.printStackTrace(); } return fileName; } /** * java获取文件的md5值 * @param fis 输入流 * @return 结果 */ public static String md5HashCode(InputStream fis) { try { //拿到一个MD5转换器,如果想使用SHA-1或SHA-256,则传入SHA-1,SHA-256 MessageDigest md = MessageDigest.getInstance("MD5"); //分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。 byte[] buffer = new byte[1024]; int length = -1; while ((length = fis.read(buffer, 0, 1024)) != -1) { md.update(buffer, 0, length); } fis.close(); //转换并返回包含16个元素字节数组,返回数值范围为-128到127 byte[] md5Bytes = md.digest(); BigInteger bigInt = new BigInteger(1, md5Bytes);//1代表绝对值 return bigInt.toString(16);//转换为16进制 } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 图片压缩 * @param file 文件 * @return 字节数组 */ public static byte[] getZipImage(MultipartFile file) { byte[] zipBytes = null; ByteArrayOutputStream outputStream = null; InputStream inputStream = null; try { byte[] bytes = file.getBytes(); outputStream = new ByteArrayOutputStream(bytes.length); inputStream = file.getInputStream(); Thumbnails.of(inputStream) .scale(0.8f) .outputQuality(1f) .toOutputStream(outputStream); zipBytes = outputStream.toByteArray(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } return zipBytes; } }