起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: ufo1982ufo

[结贴] attachmentsimple上传图片同时生成缩略图并存到服务器!

  [复制链接]

64

主题

321

帖子

679

积分

高级会员

Rank: 4

积分
679
QQ
 楼主| 发表于 2017-5-2 15:23:20 | 显示全部楼层
由于在微信里遇到了乱码之类的且压缩文件失效(见这个帖子http://bbs.wex5.com/forum.php?mod=viewthread&tid=120874&extra=),于是重新用java做了一个jar专门对上传的图片文件进行压缩。缩略图没有做了,有需要做的适当修改一下文件,同时输出一个小的图片,在前端里保存时就可以用增加的缩略图保存在mysql数据库应该就可以实现了。

大概意思就是:监控图片文件夹,有新增的就进行压缩后替换(需要缩略图的就多增加一句代码定义好宽高),用studio输出jar文件,用bat文件启动该jar并输出日志(正确和出错日志分开),最后用gpedit.msc添加开机脚本(bat文件)。


1、新建项目,包,类3个java文件:
微信截图_20170502145019.png



2、ImgResize.java文件如下:
  1. package 包名;

  2. import java.io.*;
  3. //import java.util.Date;
  4. import java.awt.*;
  5. import java.awt.image.*;
  6. import javax.imageio.ImageIO;
  7. import com.sun.image.codec.jpeg.*;


  8. /**
  9. * 图片压缩处理
  10. */
  11. public class ImgResize {
  12.     private Image img;
  13.     private int width;
  14.     private int height;  
  15.     private String pathtoresize;  
  16.    
  17.     /**
  18.      * 构造函数
  19.      */
  20. //    public ImgResize() throws IOException {
  21.     public ImgResize(String fileName) throws IOException {
  22.         File file = new File(fileName);// 读入文件
  23.         pathtoresize = fileName;
  24.         img = ImageIO.read(file);      // 构造Image对象
  25.         width = img.getWidth(null);    // 得到源图宽
  26.         height = img.getHeight(null);  // 得到源图长
  27.     }
  28.     /**
  29.      * 按照宽度还是高度进行压缩
  30.      * @param w int 最大宽度
  31.      * @param h int 最大高度
  32.      */
  33.     public void resizeFix(int w, int h) throws IOException {
  34.         if (width / height > w / h) {
  35.             resizeByWidth(w);
  36.         } else {
  37.             resizeByHeight(h);
  38.         }
  39.     }
  40.     /**
  41.      * 以宽度为基准,等比例放缩图片
  42.      * @param w int 新宽度
  43.      */
  44.     public void resizeByWidth(int w) throws IOException {
  45.         int h = (int) (height * w / width);
  46.         resize(w, h);
  47.     }
  48.     /**
  49.      * 以高度为基准,等比例缩放图片
  50.      * @param h int 新高度
  51.      */
  52.     public void resizeByHeight(int h) throws IOException {
  53.         int w = (int) (width * h / height);
  54.         resize(w, h);
  55.     }
  56.     /**
  57.      * 强制压缩/放大图片到固定的大小
  58.      * @param w int 新宽度
  59.      * @param h int 新高度
  60.      */
  61.     public void resize(int w, int h) throws IOException {
  62.         // SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
  63.         BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB );  
  64.         image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图
  65.         File destFile = new File(pathtoresize);
  66.         FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流
  67.         // 可以正常实现bmp、png、gif转jpg
  68.         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
  69.         encoder.encode(image); // JPEG编码
  70.         out.close();
  71.     }


  72. }
复制代码
3、FileListenerChange.java文件内容:

  1. package 包名;

  2. import java.io.File;

  3. import org.apache.commons.io.monitor.FileAlterationMonitor;
  4. import org.apache.commons.io.monitor.FileAlterationObserver;

  5. public class FileListenerChange {

  6.     public static void main(String[] args) {
  7.     try {
  8.         // 构造观察类主要提供要观察的文件或目录,当然还有详细信息的filter
  9.         FileAlterationObserver observer = new FileAlterationObserver(
  10.                 new File("你的图片文件夹路径"), null);
  11.         // 构造收听类
  12.         FileListenerAdaptor listener = new FileListenerAdaptor();
  13.         // 为观察对象添加收听对象
  14.         observer.addListener(listener);
  15.         // 配置Monitor,第一个参数单位是毫秒,是监听的间隔;第二个参数就是绑定我们之前的观察对象。
  16.         FileAlterationMonitor fileMonitor = new FileAlterationMonitor(
  17.             5000, new FileAlterationObserver[] { observer });
  18.         // 启动开始监听
  19.         fileMonitor.start();
  20.     } catch (Exception e) {
  21.         System.out.println("监听启动失败!");
  22.         e.printStackTrace();
  23.     }
  24.     }
  25. }
复制代码

4、监听文件变化,在新建文件时(onFileCreate)写代码,FileListenerAdaptor.java:
  1. package 包名;

  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.Date;

  5. import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
  6. import org.apache.commons.io.monitor.FileAlterationObserver;

  7. public class FileListenerAdaptor extends FileAlterationListenerAdaptor {

  8.     @Override
  9.     public void onStart(FileAlterationObserver arg0) {
  10.     System.out.println(new Date()+",begin listening!");
  11.     super.onStart(arg0);
  12.     }

  13.     @Override
  14.     public void onStop(FileAlterationObserver arg0) {
  15.     System.out.println(new Date()+",end listening!");
  16.     super.onStop(arg0);
  17.     }

  18.     @Override
  19.     public void onDirectoryCreate(File fold) {
  20.     System.out.println(new Date()+",fold: " + fold.getAbsolutePath() + " is created.");
  21.     super.onDirectoryCreate(fold);
  22.     }

  23.     @Override
  24.     public void onDirectoryChange(File fold) {
  25.     System.out.println(new Date()+",fold: " + fold.getAbsolutePath() + " is changed.");
  26.     super.onDirectoryChange(fold);
  27.     }

  28.     @Override
  29.     public void onDirectoryDelete(File fold) {
  30.     System.out.println(new Date()+",fold: " + fold.getAbsolutePath() + " is deleted.");
  31.     super.onDirectoryDelete(fold);
  32.     }

  33.     @Override
  34.     public void onFileCreate(File file) {
  35.     System.out.println(new Date()+",file: " + file.getAbsolutePath() + " is created.");
  36.     String pathtoresize = file.getAbsolutePath();
  37.     long size = file.length();
  38. //    System.out.println("新创建文件大小: " + size);
  39.     if(size >  262144){
  40.         System.out.println("新创建文件大小: " + size + ",大于256Kb的图片将被压缩....");
  41.                 try {
  42.                         ImgResize imgCom = new ImgResize(pathtoresize);
  43.                     imgCom.resizeFix(800, 800); //图片的最大尺寸
  44.                 } catch (IOException e) {
  45.                         // TODO 自动生成的 catch 块
  46.                         e.printStackTrace();
  47.                 }
  48.     } else{
  49.         System.out.println("新创建文件大小: " + size + ",小于256Kb,取消压缩....");
  50.     }
  51.     super.onFileCreate(file);
  52.     }

  53.         @Override
  54.     public void onFileChange(File file) {
  55.     System.out.println(new Date()+",file: " + file.getAbsolutePath() + " is changed.");
  56.     super.onFileChange(file);
  57.     }

  58.     @Override
  59.     public void onFileDelete(File file) {
  60.     System.out.println(new Date()+",file: " + file.getAbsolutePath() + " is deleted");
  61.     super.onFileDelete(file);
  62.     }


  63. }
复制代码

5、输出为jar文件:
微信截图_20170502145913.png


6、创建bat文件,我的bat和jar在一个文件夹下面,日志路径大家自定吧,正确日志每次启动一个文件,错误日志就进行追加,我的为:c:\resize_log,内容如下:

  1. @echo off  
  2. if not defined s set s= && start /min "" %0& exit
  3. set today=%date:~0,4%-%date:~5,2%-%date:~8,2%
  4. java -jar xxxxxxxx.jar  >c:\resize_log\log%today%_%time:~0,2%%time:~3,2%%time:~6,2%.txt 2>>c:\resize_log\errolog%today%.txt
  5. pause
复制代码

7、添加启动脚本:
微信截图_20170502150309.png


8、像这个样子:
微信截图_20170502151151.png


备注:
由于我本身也是菜鸟,大家也可以晚上查查。这个jar生成后进行监听处理新加入的图片文件,即使attachmentsimple上传的不带扩展名的都可以。
我大概看了一个,不停的张贴图片文件,每次100个,共10次,内存从16.7M一直到500M,之后回落至100M左右,cpu(4核)会有1秒左右到100%,基本都是在30%附件。我还在一台768的虚拟机里测试,内存在15M至60M之间直到处理完照片(200张左右,没有用1000张测试)。

一个重要的问题:在本地测试没有问题,在虚拟机里测试页没有问题,到了服务器会报错:
  1. Exception in thread "Thread-0" java.lang.NullPointerException
  2.         at mfxxl.ImgResize.<init>(ImgResize.java:29)
  3.         at mfxxl.FileListenerAdaptor.onFileCreate(FileListenerAdaptor.java:51)
  4.         at org.apache.commons.io.monitor.FileAlterationObserver.doCreate(FileAlterationObserver.java:379)
  5.         at org.apache.commons.io.monitor.FileAlterationObserver.checkAndNotify(FileAlterationObserver.java:345)
  6.         at org.apache.commons.io.monitor.FileAlterationObserver.checkAndNotify(FileAlterationObserver.java:335)
  7.         at org.apache.commons.io.monitor.FileAlterationObserver.checkAndNotify(FileAlterationObserver.java:335)
  8.         at org.apache.commons.io.monitor.FileAlterationObserver.checkAndNotify(FileAlterationObserver.java:335)
  9.         at org.apache.commons.io.monitor.FileAlterationObserver.checkAndNotify(FileAlterationObserver.java:335)
  10.         at org.apache.commons.io.monitor.FileAlterationObserver.checkAndNotify(FileAlterationObserver.java:304)
  11.         at org.apache.commons.io.monitor.FileAlterationMonitor.run(FileAlterationMonitor.java:182)
  12.         at java.lang.Thread.run(Unknown Source)
复制代码
估计会不会是使用NFS系统引起的不知道,其余的系统都是正常运行,即使低内存也没有出错的情况!
如果后端java基础好还是直接写为好,毕竟自己不行就做了这么一个。结贴!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2025-7-8 20:42 , Processed in 0.062502 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表