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

  • 背景
  • 相关代码
  • 错误的真正原因
  • 陷入错误的原因以及感悟

背景

在写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一段代码然后在上面修改。如果真的特别相似,也可以考虑是否能够抽象成一个参数不同的方法。

记录一次浪费时间比较多的问题相关推荐

  1. 八个防止浪费时间的小窍门

    今天跟大家分享八条避免浪费时间的小技巧并加上自己的经验,希望能帮你提高工作和学习的效率. 1.If real work needs doing offline, disable the interne ...

  2. jdk8 bug_JDK Bug系统浪费时间

    jdk8 bug 当我在OpenJDK jdk-dev邮件列表中看到Jesper Wilhelmsson的消息标题" Introducing time浪费者 "时,我想到了该消息的 ...

  3. JDK Bug系统浪费时间

    当我在OpenJDK jdk-dev邮件列表中看到Jesper Wilhelmsson的消息标题" Introducing time浪费者 "时,想到了消息的可能内容的几种可能性. ...

  4. 技术债务_不要浪费时间跟踪技术债务

    技术债务 在过去的几年中,我们一直在跟踪我们的开发积压中的技术债务 . 将积压的债务添加到待办事项中,使技术债务的成本和风险对团队和产品负责人可见,并在其他工作中优先考虑付款,以确保债务得到清偿 . ...

  5. 不要浪费时间跟踪技术债务

    在过去的几年中,我们一直在跟踪我们的开发积压中的技术债务 . 将积压的债务添加到待办事项中,使技术债务的成本和风险对团队和产品负责人可见,并在其他工作中优先考虑付款,以确保债务得到清偿 . 但是我不认 ...

  6. 51单片机可以晚电子游戏吗_电子游戏是在浪费时间吗

    51单片机可以晚电子游戏吗 Late in July, Joe Rogan made a comment on video games in episode #1514 of his prolific ...

  7. 不要再浪费时间---阅读文献技巧本

    不要再浪费时间---阅读文献技巧本文来自:博研联盟论坛  本文来自:博研联盟论坛  本文来自:博研联盟论坛  以下是作者在论坛上收集的一些有关如何阅读文献的心得,希望对大家有所帮助: 本文来自:博研联 ...

  8. 研发团队开晨会真的是浪费时间吗?

    对于研发团队,要不要开晨会,每个人都有不同的看法.有的同学觉得多次一举,纯属浪费时间,还不如去写几行代码呢.有的同学觉得很有必要,可以解决很多问题,带来不错的收益.谁对谁错其实没有一个明确的答案,我们 ...

  9. 这些情况,去面试就是浪费时间!

    对正在找工作的人来说,虽然时刻都希望能接到面试邀约,但是,有求职经验的人都知道,有一些面试其实没有必要去参加,即便参加了也是浪费时间. 前程无忧论坛(bbs.51job.com)对这类情况展开调查,按 ...

最新文章

  1. 浅谈精品游戏的研发与发行-蓝港廖明香
  2. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)
  3. Python数据结构与算法(第二天)
  4. javax.websocket.DeploymentException: The path [webScoketServiceBaidu/{appID}] is not valid.
  5. BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
  6. redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
  7. 【文末有赠书】从历史角度讲现代数学
  8. 为memcached增加缓存依赖的程序实现
  9. eclipse中open resource.不显示class文件
  10. numpy基础1多维数组对象
  11. 顶岗实习阶段工作总结
  12. cuteftp下载文件变成macintosh格式
  13. Swing - 简单入门
  14. python入门教程百度云资源-python教程大全,全套视频教程学习资料通过百度云网盘下载...
  15. xshell如何使用
  16. ckeditor富文本解决文段首行缩进问题
  17. 高通QPST Download使用方法
  18. Wireshark之流量包分析+日志分析 (护网:蓝队)web安全 取证 分析黑客攻击流程(下篇)
  19. pdk开发学习之路-从零开始
  20. chromium摘抄

热门文章

  1. java 变量名_java获取类中的变量名(利用反射机制)
  2. #周报:11月15日——11月21日
  3. 柏拉图笔下的大西洲绝不可能是克里特岛的米诺文明
  4. unity中AudioSource 无声音
  5. 卫计委:“单独二孩”政策各地明年初开始实施
  6. nginx.conf配置文件做各种拦截
  7. 搬砖工php什么意思,醒工砖是什么意思什么梗 醒工砖是醒醒工头喊你起来搬砖的意思...
  8. Android 小应用之一个activity实现简易手电筒(内附免费源码)
  9. kafka-streams api示例
  10. python图像分类实战: Keras 实现 12500 张猫狗图像的精准分类 附完整代码+数据 可直接运行 毕业设计