记录一次浪费时间比较多的问题
记录一次浪费时间比较多的问题
- 背景
- 相关代码
- 错误的真正原因
- 陷入错误的原因以及感悟
背景
在写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.If real work needs doing offline, disable the interne ...
- jdk8 bug_JDK Bug系统浪费时间
jdk8 bug 当我在OpenJDK jdk-dev邮件列表中看到Jesper Wilhelmsson的消息标题" Introducing time浪费者 "时,我想到了该消息的 ...
- JDK Bug系统浪费时间
当我在OpenJDK jdk-dev邮件列表中看到Jesper Wilhelmsson的消息标题" Introducing time浪费者 "时,想到了消息的可能内容的几种可能性. ...
- 技术债务_不要浪费时间跟踪技术债务
技术债务 在过去的几年中,我们一直在跟踪我们的开发积压中的技术债务 . 将积压的债务添加到待办事项中,使技术债务的成本和风险对团队和产品负责人可见,并在其他工作中优先考虑付款,以确保债务得到清偿 . ...
- 不要浪费时间跟踪技术债务
在过去的几年中,我们一直在跟踪我们的开发积压中的技术债务 . 将积压的债务添加到待办事项中,使技术债务的成本和风险对团队和产品负责人可见,并在其他工作中优先考虑付款,以确保债务得到清偿 . 但是我不认 ...
- 51单片机可以晚电子游戏吗_电子游戏是在浪费时间吗
51单片机可以晚电子游戏吗 Late in July, Joe Rogan made a comment on video games in episode #1514 of his prolific ...
- 不要再浪费时间---阅读文献技巧本
不要再浪费时间---阅读文献技巧本文来自:博研联盟论坛 本文来自:博研联盟论坛 本文来自:博研联盟论坛 以下是作者在论坛上收集的一些有关如何阅读文献的心得,希望对大家有所帮助: 本文来自:博研联 ...
- 研发团队开晨会真的是浪费时间吗?
对于研发团队,要不要开晨会,每个人都有不同的看法.有的同学觉得多次一举,纯属浪费时间,还不如去写几行代码呢.有的同学觉得很有必要,可以解决很多问题,带来不错的收益.谁对谁错其实没有一个明确的答案,我们 ...
- 这些情况,去面试就是浪费时间!
对正在找工作的人来说,虽然时刻都希望能接到面试邀约,但是,有求职经验的人都知道,有一些面试其实没有必要去参加,即便参加了也是浪费时间. 前程无忧论坛(bbs.51job.com)对这类情况展开调查,按 ...
最新文章
- 浅谈精品游戏的研发与发行-蓝港廖明香
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)
- Python数据结构与算法(第二天)
- javax.websocket.DeploymentException: The path [webScoketServiceBaidu/{appID}] is not valid.
- BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
- redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
- 【文末有赠书】从历史角度讲现代数学
- 为memcached增加缓存依赖的程序实现
- eclipse中open resource.不显示class文件
- numpy基础1多维数组对象
- 顶岗实习阶段工作总结
- cuteftp下载文件变成macintosh格式
- Swing - 简单入门
- python入门教程百度云资源-python教程大全,全套视频教程学习资料通过百度云网盘下载...
- xshell如何使用
- ckeditor富文本解决文段首行缩进问题
- 高通QPST Download使用方法
- Wireshark之流量包分析+日志分析 (护网:蓝队)web安全 取证 分析黑客攻击流程(下篇)
- pdk开发学习之路-从零开始
- chromium摘抄
热门文章
- java 变量名_java获取类中的变量名(利用反射机制)
- #周报:11月15日——11月21日
- 柏拉图笔下的大西洲绝不可能是克里特岛的米诺文明
- unity中AudioSource 无声音
- 卫计委:“单独二孩”政策各地明年初开始实施
- nginx.conf配置文件做各种拦截
- 搬砖工php什么意思,醒工砖是什么意思什么梗 醒工砖是醒醒工头喊你起来搬砖的意思...
- Android 小应用之一个activity实现简易手电筒(内附免费源码)
- kafka-streams api示例
- python图像分类实战: Keras 实现 12500 张猫狗图像的精准分类 附完整代码+数据 可直接运行 毕业设计