問題:
最近寫項目的時候遇到一個這樣的問題,在對接第三方接口的時候需要傳輸圖片,比如身份證、營業執照、辦公場所等....但是對方的接口又做了限制,最大隻接收200k的圖片。小編這時候就頭疼了,現在的圖片一般不都是幾兆幾兆的高清圖嗎,比如隨便用手機拍個照片都是一兩兆。然後小編翻閱了很多資料,最終覺得還是下面這種比較實用。
①圖片上傳:(方法返回值以及OSS上傳,方法名都可以忽略)
//圖片兩百K壓縮上傳
public static ResponseResult uploadImg2O0KImg(String source, String folderName, String fileName, String envActive, MultipartFile multipartfile) throws Exception {
if (multipartfile.getSize() > 50 * 1024 * 1024) {
throw new Exception("上傳圖片大小不能超過10M!");
}
String filePath = envActive+"/"+source+"/"+folderName;
//設置統一圖片後綴名
String suffixName;
//獲取圖片文件名(不帶擴展名的文件名)
String prefixName = getFileNameWithoutEx(multipartfile.getOriginalFilename());
//獲取圖片後綴名,判斷如果是png的話就不進行格式轉換,因爲Thumbnails存在轉png->jpg圖片變紅bug
String suffixNameOrigin = getExtensionName(multipartfile.getOriginalFilename());
if ("png".equals(suffixNameOrigin)) {
suffixName = "png";
} else {
suffixName = "jpg";
}
BufferedImage image = ImageIO.read(multipartfile.getInputStream());
BufferedImage output = Thumbnails.of(image).size(image.getWidth(), image.getHeight()).asBufferedImage();
String base64Str = imageToBase64(output);
//循環判斷是否大於200k[性能方面的話,可能有點差]
while (base64Str.length() - base64Str.length() / 8 * 2 > 200000) { //200k
output = Thumbnails.of(output).outputQuality(1f).scale(0.9f).asBufferedImage();
base64Str = imageToBase64(output);
}
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytes = decoder.decodeBuffer(base64Str);
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
//設置圖片存儲在oss上的名字
if (fileName == null) {
fileName = Long.toString(System.currentTimeMillis()) + "."+suffixName;
} else {
fileName = fileName + "."+suffixName;
}
//上傳OSS
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
client.putObject(bucketName, filePath+"/"+fileName, in);
String path = "https://xinyifu-soho.oss-cn-shanghai.aliyuncs.com/"+filePath+"/"+fileName;
return CommonResponseUtils.successResponse("上傳成功",path);
};
②圖片轉Base64
public static String imageToBase64(BufferedImage bufferedImage) {
BASE64Encoder encoder = new BASE64Encoder();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ImageIO.write(bufferedImage, "jpg", baos);
} catch (IOException e) {
e.fillInStackTrace();
}
return new String(encoder.encode((baos.toByteArray())));
}
③文件名/文件後綴名
/**
* 獲取文件擴展名
*
* @param filename 文件名
* @return
*/
public static String getExtensionName(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length() - 1))) {
return filename.substring(dot + 1);
}
}
return filename;
}
/**
* 獲取不帶擴展名的文件名
*
* @param filename 文件
* @return
*/
private static String getFileNameWithoutEx(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length()))) {
return filename.substring(0, dot);
}
}
return filename;
}