JAVA - 圖片壓縮上傳

問題:  

     最近寫項目的時候遇到一個這樣的問題,在對接第三方接口的時候需要傳輸圖片,比如身份證、營業執照、辦公場所等....但是對方的接口又做了限制,最大隻接收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;
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章