业务模型
- 已知图片网络图片url(或一段含有图片的富文本)。
- 通过图片url加载图片到本地(或者读取富文本中的img属性解析图片url)(使用方法 getFileByNetUrlHttp、getImgStr)。
- 获取文件大小并转换为MB(使用formatFileSize)
- 如果文件大于一定大小(fileMaxVlue)按照比例(reduce)压缩通过url加载的本地图片,并重命名(方法renameAndReduceFile)。
- 图片压缩完成之后转换成MultipartFile并提交到上传接口(uploadPostUrl ),删除压缩后的本地图片(sendMultipartFilePost)。
工具类主要功能
- 网络图片加载到本地Fille(getFileByNetUrlHttp)
- 获取文件File大小,并转换为MB单位(formatFileSize)
- 图片按照比例压缩成新文件File,重命名(renameAndReduceFile)
- 图片File转换为MultipartFile对象(getMultipartFile)
- 提交MultipartFile对象到图片上传接口(sendMultipartFilePost)
- 富文本中提取图片(img标签src属性)(getImgStr)
工具类源码
package com.shipj.test.util;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.mock.web.MockMultipartFile;
import java.io.*;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author shipj
* @version 1.0
* @Title: ProductpPcturesDealUtil
* @Description: 图片压缩并接口上传工具类(业务模型,从图片url(从图片url或富文本中包含url)加载图片到本,本地进行压缩图片,压缩完成之后通过接口上传到服务)
* @date 2021-04-09 16:19
*/
@Slf4j
public class ProductpPcturesDealUtil {
//压缩比例
private static float reduce = 0.3f;
//文件临时目录
private static String fileDir = "D:\\TEMP\\";
//上传图片url
private static String uploadPostUrl = "https://127.0.0.1:8080/test/storage/putFile";
//上传文件名称
private static String fileParName = "file";
//需压缩文件界值
public static float fileMaxVlue = 5f;
//img Matcher 对象
private static Pattern p_image=Pattern.compile("<img.*src\\s*=\\s*(.*?)[^>]*?>",Pattern.CASE_INSENSITIVE);
//img src Matcher 对象
private static Pattern r_image=Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)");
/**
* @return float
* @Author shipj
* @Description 转换文件大小(MB)
* @Date 10:58 2021-04-09
* @Param [fileLength] file length
**/
public static float formatFileSize(long fileLength) {
if (fileLength == 0) {
return 0;
}
//运算转换单位(保留2位小数)
float mbUnit = 1048676;
float mbValue = ((float) fileLength) / mbUnit;
//转换单位为MB
float fileSizeMB = new BigDecimal(mbValue).setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
return fileSizeMB;
}