记录一次浪费时间比较多的问题

背景

在写SpringBoot的校园商铺系统时,在自己的windows系统上测试没有问题,打包发布到linux服务器上就一直报创建缩略图失败错误,抛出如下异常

java.lang.RuntimeException: 创建缩略图失败:javax.imageio.IIOException: Can't read input file!

起初我以为是linux读取不到图片(我甚至给图片更改了777权限),后来写了测试小程序发现并没有问题

相关代码

这个是之前错误的

/**
	 * 处理缩略图,并返回新生成图片的相对值路径
	 * 
	 * @param thumbnail
	 * @param targetAddr
	 * @return
	 */
	public static String generateThumbnail(ImageHolder thumbnail, String targetAddr) {
		// 获取不重复的随机名
		String realFileName = getRandomFileName();
		// 获取文件的扩展名如png,jpg等
		String extension = getFileExtension(thumbnail.getImageName());
		// 如果目标路径不存在,则自动创建
		makeDirPath(targetAddr);
		// 获取文件存储的相对路径(带文件名)
		String relativeAddr = targetAddr + realFileName + extension;
		logger.debug("current relativeAddr is :" + relativeAddr);
		// 获取文件要保存到的目标路径
		File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("current complete addr is :" + PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("basePath is :" + basePath);
		// 调用Thumbnails生成带有水印的图片
		try {
			System.out.println("***************************"+basePath+"**********************************");
			Thumbnails.of(thumbnail.getImage()).size(200, 200)
					.watermark(
							Positions.BOTTOM_RIGHT, 
					ImageIO.read(new File("E:\\test\\watermark.png")), 0.25f)
					.outputQuality(0.8f).toFile(dest);
		} catch (IOException e) {
			logger.error(e.toString());
			throw new RuntimeException("创建缩略图失败:" + e.toString());
		}
		// 返回图片相对路径地址
		return relativeAddr;
	}

	/**
	 * 处理详情图,并返回新生成图片的相对值路径
	 * 
	 * @param thumbnail
	 * @param targetAddr
	 * @return
	 */
	public static String generateNormalImg(ImageHolder thumbnail, String targetAddr) {
		// 获取不重复的随机名
		String realFileName = getRandomFileName();
		// 获取文件的扩展名如png,jpg等
		String extension = getFileExtension(thumbnail.getImageName());
		// 如果目标路径不存在,则自动创建
		makeDirPath(targetAddr);
		// 获取文件存储的相对路径(带文件名)
		String relativeAddr = targetAddr + realFileName + extension;
		logger.debug("current relativeAddr is :" + relativeAddr);
		// 获取文件要保存到的目标路径
		File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("current complete addr is :" + PathUtil.getImgBasePath() + relativeAddr);
		// 调用Thumbnails生成带有水印的图片
		/**
		 * 本地添加水印
		 
		try {
			System.out.println("***************************"+basePath+"**********************************");
			Thumbnails.of(thumbnail.getImage()).size(200, 200)
					.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("E:\\test\\watermark.png")), 0.25f)
					.outputQuality(0.8f).toFile(dest);
		}*/
		try {
			System.out.println("***************************"+basePath+"**********************************");
			System.out.println("@@@@@@@@relativeAddr="+relativeAddr);
			System.out.println("@@@@@@@@targetAddr="+targetAddr);
			System.out.println("@@@@@@@@dest="+dest);
			Thumbnails.of(thumbnail.getImage()).size(337, 640)
					.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/watermark.png")), 0.25f)
					.outputQuality(0.9f).toFile(dest);
			System.out.println();
		} catch (IOException e) {
			logger.error(e.toString());
			throw new RuntimeException("创建缩图片失败:" + e.toString());
		}
		// 返回图片相对路径地址
		return relativeAddr;
	}

这个是修改后的

	/**
	 * 处理缩略图,并返回新生成图片的相对值路径
	 * 注意:下面有类似的处理详情图片方法 generateNormalImg()
	 * @param thumbnail
	 * @param targetAddr
	 * @return
	 */
	public static String generateThumbnail(ImageHolder thumbnail, String targetAddr) {
		// 获取不重复的随机名
		String realFileName = getRandomFileName();
		// 获取文件的扩展名如png,jpg等
		String extension = getFileExtension(thumbnail.getImageName());
		// 如果目标路径不存在,则自动创建
		makeDirPath(targetAddr);
		// 获取文件存储的相对路径(带文件名)
		String relativeAddr = targetAddr + realFileName + extension;
		logger.debug("current relativeAddr is :" + relativeAddr);
		// 获取文件要保存到的目标路径
		File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("current complete addr is :" + PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("basePath is :" + basePath);
		// 调用Thumbnails生成带有水印的图片
		try {
			System.out.println("***************************"+basePath+"**********************************");
			Thumbnails.of(thumbnail.getImage()).size(200, 200)
					.watermark(
							Positions.BOTTOM_RIGHT, 
					ImageIO.read(new File(basePath + "/watermark.png")), 0.25f)
					.outputQuality(0.8f).toFile(dest);
		} catch (IOException e) {
			logger.error(e.toString());
			throw new RuntimeException("创建缩略图失败:" + e.toString());
		}
		// 返回图片相对路径地址
		return relativeAddr;
	}

	/**
	 * 处理详情图,并返回新生成图片的相对值路径
	 * 注意:上面有类似的处理详情图片方法 generateThumbnail()
	 * @param thumbnail
	 * @param targetAddr
	 * @return
	 */
	public static String generateNormalImg(ImageHolder thumbnail, String targetAddr) {
		// 获取不重复的随机名
		String realFileName = getRandomFileName();
		// 获取文件的扩展名如png,jpg等
		String extension = getFileExtension(thumbnail.getImageName());
		// 如果目标路径不存在,则自动创建
		makeDirPath(targetAddr);
		// 获取文件存储的相对路径(带文件名)
		String relativeAddr = targetAddr + realFileName + extension;
		logger.debug("current relativeAddr is :" + relativeAddr);
		// 获取文件要保存到的目标路径
		File dest = new File(PathUtil.getImgBasePath() + relativeAddr);
		logger.debug("current complete addr is :" + PathUtil.getImgBasePath() + relativeAddr);
		// 调用Thumbnails生成带有水印的图片

		try {
			Thumbnails.of(thumbnail.getImage()).size(337, 640)
					.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/watermark.png")), 0.25f)
					.outputQuality(0.9f).toFile(dest);
			System.out.println();
		} catch (IOException e) {
			logger.error(e.toString());
			throw new RuntimeException("创建详情图片失败:" + e.toString());
		}
		// 返回图片相对路径地址
		return relativeAddr;
	}

错误的真正原因

看完代码应该很容易就能看出来,是生成缩略图时使用了windows的绝对路径引入水印图片,导致了Can't read input file!

陷入错误的原因以及感悟

根据提示,一直在生成缩略图的方法里面找bug,其实我感觉被这个错误困这么久的最大原因就是那个报错信息。由于两个方法作用很相似,写第二个方法的时候就直接copy了第一个方法然后修改的,这就导致了报错信息忘记修改的巨大错误。
由此也吸取了教训,以后写方法,方法名一定要有区分性,方法名相似的方法(特别是方法体也很相似的方法)甚至可以用注释标注上注意和另外一个方法做好区分,还有就是尽量不要图省事直接copy一段代码然后在上面修改。如果真的特别相似,也可以考虑是否能够抽象成一个参数不同的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Labvive是一款科学实验室中常用的仪器。它能够精准地采集各种物质的数据。在实际使用过程中,Labvive每隔0.1秒就会采一次数据,这意味着它的数据精度很高,能够准确地反映物质的变化情况。 由于Labvive采集数据的时间间隔非常短,所以它能够记录下极其微小的变化。这对于一些需要高精度实验的实验室非常重要,因为这些微小的变化可能会对实验结果产生影响。如果没有这种高精度的仪器,实验结果将会受到严重的影响,甚至可能无法获得准确的数据。 另外,Labvive每隔0.1秒采一次数据,也意味着它能够实时地监测物质的变化。在某些需要实时监测的实验中,这种实时监测能力非常重要。如果实验中出现了错误或异常情况,能够及时发现并解决问题,从而避免在实验过程中浪费时间和资源。 综上所述,Labvive每隔0.1秒采一次数据,是因为它需要高精度地采集物质的数据,并且实时监测物质的变化。这种高精度、实时监测的能力,非常适合各种高精度实验的需要。 ### 回答2: labvive是一种实验室设备,它每隔0.1秒采集一次数据。这意味着它以非常高的频率对实验过程中的各种参数进行测量和记录。 高频数据采集能够提供更准确、详细的实验数据,因为它可以捕捉到实验过程中的微小变化。这对于某些需要高精度的实验非常重要,例如在研究生物反应动力学、物理实验等领域。 通过每隔0.1秒采集一次数据,labvive能够提供更精确的实验结果。它可以记录实验过程中的瞬时变化,并生成一个连续数据流。这样的数据可以帮助研究人员更好地理解实验过程中不同参数的变化趋势、相互作用以及其它相关的信息。 此外,labvive还可以与其他实验设备配合使用。例如,它可以与温度计、光电传感器等设备进行串联,以实现多参数的实时监测。 总之,labvive每隔0.1秒采一次数据,为实验研究提供了高频率、高精度的数据采集能力。这样的数据可以深入研究实验过程中微小变化的规律,有助于科研工作者进行更准确、全面的实验分析和结果推导。 ### 回答3: Labvive是一种实验室设备,它具有高速数据采集的能力,每隔0.1秒就能采集一次数据。这种高速数据采集的频率能够帮助研究人员收集更加准确和详细的实验数据。 高频率的数据采集对于很多实验和研究项目是非常必要的。例如,在化学实验中,瞬态反应的研究需要非常高的时间分辨率,以观察分子之间的短暂相互作用。Labvive的每0.1秒的采样频率使得研究人员能够精确地捕捉到这些瞬态反应的变化过程。 此外,在生物学实验中,Labvive每隔0.1秒采样的数据可以用于观察细胞内的快速生物过程。例如,细胞内的信号传导过程可能在非常短的时间内发生变化,高频率的采样可以提供对这些变化的详细了解。 Labvive的高速数据采集还对于物理学、工程学等领域的实验研究非常重要。比如在物理学中,研究快速运动体、粒子碰撞等实验需要非常高的时间分辨率,以获得精确的数据结果。 总之,Labvive每隔0.1秒采集一次数据的能力使得实验研究人员能够获得更加准确、详细的数据,推动了科学研究和实验的进展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值