图片上传工具:ImageUtils

使用Thumbnailator 上传图片 并压缩图片

引入依赖

			<!-- 图片缩略图 -->
            <dependency>
                <groupId>net.coobird</groupId>
                <artifactId>thumbnailator</artifactId>
                <version>0.4.8</version>
            </dependency>
            <!-- IO工具类 -->
            <dependency>
				<groupId>org.apache.commons</groupId>
				<artifactId>commons-io</artifactId>
				<version>1.3.2</version>
			</dependency>

工具类:ImageUtil

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import com.leopard.util.bean.ImageResult;
import com.leopard.util.enums.SystemCodeAndMsg;
import com.leopard.util.number.MathUtil;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.Thumbnails.Builder;

/**
 * 图片工具类
 * @author leopard
 *
 */
public class ImageUtil {

	/**
	 * 简单上传图片,不做任何处理
	 * 
	 * @param imagePath
	 *            目标文件夹路径
	 * @param imageName
	 *            图片名称
	 * @param inputStream
	 *            输出流
	 * @return
	 */
	public static ImageResult uploadImage(String imagePath, String imageName, InputStream inputStream) {

		BufferedInputStream inBuff = null;
		BufferedOutputStream outBuff = null;
		if (!"/".equals(imagePath.substring(imagePath.length() - 1, imagePath.length()))
				&& !"\\".equals(imagePath.substring(imagePath.length() - 1, imagePath.length()))) {
			imagePath += "/";
		}
		File realFile = new File(imagePath);
		// 不存在文件夹则创建
		if (!realFile.exists())
			realFile.mkdirs();
		try {
			// 新建文件输入流并对它进行缓冲
			inBuff = new BufferedInputStream(inputStream);
			// 新建文件输出流并对它进行缓冲
			outBuff = new BufferedOutputStream(new FileOutputStream(imagePath + "/" + imageName));
			// 缓冲数组
			byte[] b = new byte[1024 * 5];
			int len;
			while ((len = inBuff.read(b)) != -1) {
				outBuff.write(b, 0, len);
			}
			// 刷新此缓冲的输出流
			outBuff.flush();
		} catch (FileNotFoundException a) {
			a.printStackTrace();
			return ImageResult.error("目标文件夹找不到");
		} catch (IOException e) {
			e.printStackTrace();
			return ImageResult.error("操作流异常!");
		} finally {
			// 关闭流
			try {
				if (inBuff != null)
					inBuff.close();
				if (outBuff != null)
					outBuff.close();
			} catch (IOException c) {
				c.printStackTrace();
			}
		}
		StringBuffer result = new StringBuffer(imagePath);
		result.append(imageName);
		return ImageResult.success(result.toString(), null);
	}

	/**
	 * 图片名生成
	 */
	public static String genImageName() {

		// 取当前时间的长整形值包含毫秒
		long millis = System.currentTimeMillis();
		// 加上三位随机数
		int end3 = MathUtil.getNumRandom(3);
		// 如果不足三位前面补0
		String str = millis + String.format("%03d", end3);

		return str;
	}

	/**
	 * 保存图片并且生成缩略图
	 * 
	 * @param imagePath
	 *            目标文件夹路径
	 * @param imageName
	 *            图片名称
	 * @param inputStream
	 *            输出流
	 * @param fileSize
	 *            文件大小
	 * @param width
	 *            期望宽度
	 * @param height
	 *            期望高度
	 * @return
	 */
	public static ImageResult uploadFileAndCreateThumbnail(String imagePath, String imageName, InputStream inputStream,
			long fileSize, int width, int height) {

		if (width == 0 || height == 0) {
			return ImageResult.error("请设置缩略图宽高!");
		}

		// 保存源文件
		ImageResult uploadImage = uploadImage(imagePath, imageName, inputStream);
		if (!SystemCodeAndMsg.SUCCESS.code().equals(uploadImage.getCode())) {
			return uploadImage;
		}

		/*** 缩略图begin */
		// 源图片路径
		StringBuffer imagePathBuffer = new StringBuffer(imagePath);
		// 如果最后不存在斜杆,则自行添加
		if (!"/".equals(imagePath.substring(imagePath.length() - 1, imagePath.length()))
				&& !"\\".equals(imagePath.substring(imagePath.length() - 1, imagePath.length()))) {
			imagePathBuffer.append("/");
		}
		String filePathName = imagePathBuffer.append(imageName).toString();
		// 目标图片(移除后缀 并改名 xxx.jpg
		// ->xxxx-small)不含后缀路径,目的在下面的outputFormat(jpg),转化为固定的jpg格式文件
		StringBuffer thumbnailFilePathName = new StringBuffer(filePathName.substring(0, filePathName.lastIndexOf(".")))
				.append("-small");
		thumbnailFilePathName = thumbnailFilePathName.append(".jpg");
		String disposeUrl = thumbnailFilePathName.toString();
		try {
			Builder<File> builderFile = Thumbnails.of(filePathName);
			// 压缩200KB
			if (fileSize > 200 * 1024) {
				builderFile.outputQuality((200 * 1024f) / fileSize);
			}
			// 按自定义大小比例缩放
			builderFile.forceSize(width, height).toFile(disposeUrl);

		} catch (Exception e1) {
			return ImageResult.error(e1.getMessage());
		}
		/*** 缩略图end */
		return ImageResult.success(uploadImage.getUrl(), disposeUrl);
	}

}

返回数据处理实体

/**
 * 图片响应
 * 
 * @author leopard
 *
 */
public class ImageResult {

	/**
	 * 状态码
	 */
	private String code;
	/**
	 * 文件原地址
	 */
	private String url;
	/**
	 * 文件处理后地址
	 */
	private String disposeUrl;
	/**
	 * 响应信息
	 */
	private String message;

	public ImageResult() {

	}

	public ImageResult(String code, String url, String disposeUrl, String message) {
		this.code = code;
		this.url = url;
		this.disposeUrl = disposeUrl;
		this.message = message;
	}

	/**
	 * 成功时调用的方法
	 * 
	 * @param url
	 *            源文件路径
	 * @param disposeUrl
	 *            文件处理后路径
	 * @return
	 */
	public static ImageResult success(String url, String disposeUrl) {
		return new ImageResult(SystemCodeAndMsg.SUCCESS.code(), url, disposeUrl, SystemCodeAndMsg.SUCCESS.msg());
	}

	/**
	 * 失败时调用的方法
	 * 
	 * @param message
	 *            错误信息
	 * @return
	 */
	public static ImageResult error(String message) {
		return new ImageResult(SystemCodeAndMsg.FAIL.code(), null, null, message);
	}
	。。。。get/set
}

应用业务层(测试)

	@RequestMapping(value = "/savePic", method = RequestMethod.POST)
	@ResponseBody
	public JSONObject sendSimple(MultipartFile uploadFile) {

		JSONObject jsonObject = new JSONObject();
		jsonObject.put("code", SystemCodeAndMsg.WEB_SUCCESS.code());
		jsonObject.put("msg", SystemCodeAndMsg.WEB_SUCCESS.msg());

		String IMAGE_BASE_URL = "H:";

		// 判断上传图片是否为空
		if (null == uploadFile || uploadFile.isEmpty()) {
			return jsonObject;
		}
		if (uploadFile.getSize() >= 5 * 1024 * 1024) {
			jsonObject.put("msg", "文件不能大于5M");
			return jsonObject;
		}

		// 取文件扩展名
		String ext = FilenameUtils.getExtension(uploadFile.getOriginalFilename());
		String imageName = ImageUtil.genImageName() + "." + ext;
		// 文件在服务器的存放路径,应该使用日期分隔的目录结构
		DateTime dateTime = new DateTime();
		String filePath = dateTime.toString("yyyy/MM/dd");
		String imagePath = IMAGE_BASE_URL + "/uploadImg/" + filePath;
		try {
//			ImageResult uploadFileAndCreateThumbnail1 = ImageUtil.uploadFileAndChangeSize(imagePath, imageName,
//					uploadFile.getInputStream(), uploadFile.getSize());
			ImageResult uploadFileAndCreateThumbnail = ImageUtil.uploadFileAndChangeWidthAndHeight(imagePath, imageName, 
					uploadFile.getInputStream(), 200, 500);
			jsonObject.put("msg", uploadFileAndCreateThumbnail.getUrl());
			jsonObject.put("msg2", uploadFileAndCreateThumbnail.getDisposeUrl());
		} catch (Exception e) {
			e.printStackTrace();
			return jsonObject;
		}
		// 返回结果,生成一个可以访问到图片的url返回
		return jsonObject;
	}

参考文献:

java 使用Thumbnailator 上传图片 并压缩图片大小

Thumbnailator使用简介

java使用Thumbnailator处理图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值