上传图片时用的SmartUpload,但在上传同时还想生成缩略图,怎样实现?

时间:2021-06-16 22:06:35
上传图片时用的SmartUpload,原图片上传到一个文件夹,但在上传同时还想生成缩略图存到另一个文件夹中,要求缩略图与原图等比例缩小,用jsp怎样实现?
或者有其他方法实现缩略图,多谢大家了,很急阿!

10 个解决方案

#1


取SmartUpload上传后的文件名(SmartUpload中已实现),然后传值到要显示的页面,指定图片width,height不就能实现了。
思路就这样,具体看SmartUpload的examples吧。

#2


用width,height控制不行!如果图片太大速度不行,并且图片的比例也不对,图片的大小不确定,但是要求缩略图具有相同高度,等比例缩小!就像ChinaRen同学录那样的,哪伟大哥帮忙阿,小弟水平有限阿,不胜感激~~~

#3


刚好我也需要这样的东东。顶一下

#4


自己顶一下

#5


gz!

#6


图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理.

下面的程序使用jdk1.4中最新的ImageIO对图片进行读写.使用AffineTransform对图片进行缩放.

 


import java.io.File;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.awt.image.AffineTransformOp;
import javax.imageio.ImageIO;
import java.awt.geom.AffineTransform;

public class UploadImg{

/**
* @param fromdir 图片的原始目录
* @param todir 处理后的图片存放目录
* @param imgfile 原始图片
* @param sysimgfile 处理后的图片文件名前缀
*
*/ 

............................ 


public boolean CreateThumbnail() throws Exception
{
//ext是图片的格式 gif JPG 或png
String ext="";
double Ratio=0.0;
File F = new File(fromdir,imgfile);
if (!F.isFile())
throw new Exception(F+" is not image file error in CreateThumbnail!");

//首先判断上传的图片是gif还是JPG ImageIO只能将gif转换为png
if (isJpg(imgfile)){
ext="jpg";
}else{
ext="png"; 
}
File ThF = new File(todir,sysimgfile+"."+ext); 


BufferedImage Bi = ImageIO.read(F);
//假设图片宽 高 最大为120 120
Image Itemp = Bi.getScaledInstance (120,120,Bi.SCALE_SMOOTH);


if ((Bi.getHeight()>120) || (Bi.getWidth()>120)){
if (Bi.getHeight()>Bi.getWidth())
Ratio = 120.0/Bi.getHeight();
else
Ratio = 120.0/Bi.getWidth();
}


AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(Ratio, Ratio), null);
Itemp = op.filter(Bi, null);

try {
ImageIO.write((BufferedImage)Itemp, ext, ThF);
}catch (Exception ex) {
throw new Exception(" ImageIo.write error in CreatThum.: "+ex.getMessage()); 
}
return (true);
}
}

 

#7


public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  {
    response.setContentType("text/html;charset=gb2312");
    PrintWriter out = response.getWriter();
    String titleid="1";//标题id
    String fileName=new String();//上传的文件名称
    dbConn db=new dbConn();
    try
    {
      System.out.println("开始上传附件");
      SmartUpload mySmartUpload = new SmartUpload();

      ResultSet rs=null;
      mySmartUpload.initialize(config, request, response);
      mySmartUpload.setMaxFileSize(1024 * 1024 * 10);//上传文件最大尺寸
      mySmartUpload.upload();//上传
      Enumeration enumer=mySmartUpload.getRequest().getParameterNames();
      String strsql=new String();//sql语句
      for (int i=0;i<mySmartUpload.getFiles().getCount();i++)//循环上传附件
      {
        com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);//取得文件
        fileName=myFile.getFileName();//取得文件名
        //String filetype=mySmartUpload.getFiles().getFile(i).getFileExt();//获取后缀名
        if(!myFile.isMissing())
        {
          myFile.saveAs("uploadfile/"+fileName);//保存上传的文件到服务器的uploadfile目录下
          System.out.println("文件名:"+fileName);//后台显示文件名
         // java.io.File sfile=new java.io.File(request.getRealPath("")+"\\uploadfile\\"+fileName);//创建文件对象
         // java.io.InputStream inStream=new java.io.FileInputStream(sfile);//将文件读到流中
          int fileSize=myFile.getSize();//获取文件大小(字节)
          if(fileSize>mySmartUpload.getSize())
          {
            System.out.println("上传文件过大!");
            int err=1/0;
          }
          System.out.println("文件大小:"+(int)(fileSize/1024)+"KB");//后台显示文件大小
          if(fileSize!=0)
          {
            String contenttype = myFile.getContentType();//获得文件类型
            System.out.println("文件类型:"+contenttype);//后台显示文件类型
            String blobzd=new String();//blob字段名
            if(!contenttype.trim().equals("image/pjpeg") && !contenttype.trim().equals("image/gif"))
            {
              System.out.println("上传的文件不是规定格式的图片!");
              throw new Exception("上传的文件不是规定格式的图片");
            }
            String sql="insert into tblpicture values(?,?,?,?)";
            String sFilePath="\\bea\\wlserver6.1\\config\\mydomain\\applications\\DefaultWebApp\\uploadfile\\"+fileName;
            db.WriteFile(1,sFilePath,contenttype,sql);

          /*   
           strsql="insert into tblpicture(id,titleid,num,picture,img,thumbnail) values(pictureid.nextval,"+titleid+","+fileSize+",'"+contenttype.trim()+"',empty_blob(),empty_blob())";//插入一条空图片数据进图片表
            System.out.println(strsql);
            db.executeUpdate(strsql);
            System.out.println("-------生成缩略图---------------");
            //------------生成缩略图------------------//
            BufferedImage image;
            Image img=null;
            Toolkit tk=Toolkit.getDefaultToolkit();
            Applet app=new Applet();
            MediaTracker mt = new MediaTracker(app);
            img=tk.getImage(request.getRealPath("")+"\\uploadfile\\"+fileName);//获取原始图
            mt.addImage(img, 0);
            mt.waitForID(0);
            double rate1=((double)img.getWidth(null))/120.0+0.1;
            double rate2=((double)img.getHeight(null))/120.0+0.1;
            double rate=rate1>rate2?rate1:rate2;
            int new_w=(int)(((double)img.getWidth(null))/rate);
            int new_h=(int)(((double)img.getHeight(null))/rate);
            BufferedImage buffImg = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
            Graphics g = buffImg.createGraphics();
            g.setColor(Color.white);
            g.fillRect(0,0,new_w,new_h);
            g.drawImage(img,0,0,new_w,new_h,null);//绘制缩略图
            System.out.println("-------绘制缩略图---------------");
            g.dispose();
            java.io.OutputStream tempout=null;
            java.io.File tempfile=new java.io.File(request.getRealPath("")+"\\uploadfile\\"+fileName+"_small.jpg");
            tempout= new FileOutputStream(tempfile);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
            encoder.encode(buffImg);
            if(tempout!=null)tempout.close();
            //------------缩略图生成完毕----------------//
            //------------缩略图入库-------------------//
            System.out.println("--------缩略图生成完毕-------");
            java.io.InputStream tempinstream=new java.io.FileInputStream(tempfile);//将缩略图文件读到流中
            System.out.println("--------将缩略图文件读到流中-------");
            strsql="select thumbnail from tblpicture where titleid="+titleid+" and dbms_lob.getlength(thumbnail)=0 for update ";//选择图片表的缩略图字段更新
            rs=db.executeQuery3(strsql);
             System.out.println("------写缩略图数据进blob类型字段-----");
            if (rs !=null && rs.next())//写缩略图数据进blob类型字段
            {
              System.out.println("缩略图入库!!!!!!");
              oracle.sql.BLOB tempblob=((oracle.jdbc.OracleResultSet)rs).getBLOB("thumbnail");
              System.out.println("aaaaaaaaaaaaaaaaaa!");
              tempout = tempblob.getBinaryOutputStream();
              byte[] tempbytes = new byte[(int) tempfile.length()];//创建缓冲区
              tempinstream.read(tempbytes);
              tempout.write(tempbytes);
              tempout.flush();
              db.commit();
              if(tempout!=null)tempout.close();
            }
            if(tempinstream!=null)tempinstream.close();
            if(tempfile!=null){if(tempfile.delete())System.out.println("缩略图入库完毕!临时文件已删除!");}//删除缩略图临时文件
            //---------------缩略图入库完毕-------------//
            strsql="select img from tblpicture where titleid="+titleid+" and dbms_lob.getlength(img)=0 for update ";//选择图片表的图片字段更新
            rs=db.executeQuery3(strsql);
            if (rs !=null && rs.next())//写数据进blob类型字段
            {
              oracle.sql.BLOB blob=((oracle.jdbc.OracleResultSet)rs).getBLOB(blobzd);
              java.io.OutputStream outStream = blob.getBinaryOutputStream();
              byte[] bytes = new byte[fileSize];//创建缓冲区
              inStream.read(bytes);
              outStream.write(bytes);
              outStream.flush();
              db.commit();
              if(outStream!=null)outStream.close();
            }
            */
          }
         // if(inStream!=null)inStream.close();
          //if(sfile!=null){if(sfile.delete())System.out.println("临时文件已删除");}//删除临时文件
        }
      }

      System.out.println("文件上传完毕");
    }
    catch(Exception ex1)
    {
      System.out.println(ex1.toString());
    }

#8


mark:)

#9


Graphics 对象是不是要依赖于图像环境的操作系统才能创建啊

#10


谢谢各位兄弟了,给分!

#1


取SmartUpload上传后的文件名(SmartUpload中已实现),然后传值到要显示的页面,指定图片width,height不就能实现了。
思路就这样,具体看SmartUpload的examples吧。

#2


用width,height控制不行!如果图片太大速度不行,并且图片的比例也不对,图片的大小不确定,但是要求缩略图具有相同高度,等比例缩小!就像ChinaRen同学录那样的,哪伟大哥帮忙阿,小弟水平有限阿,不胜感激~~~

#3


刚好我也需要这样的东东。顶一下

#4


自己顶一下

#5


gz!

#6


图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理.

下面的程序使用jdk1.4中最新的ImageIO对图片进行读写.使用AffineTransform对图片进行缩放.

 


import java.io.File;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.awt.image.AffineTransformOp;
import javax.imageio.ImageIO;
import java.awt.geom.AffineTransform;

public class UploadImg{

/**
* @param fromdir 图片的原始目录
* @param todir 处理后的图片存放目录
* @param imgfile 原始图片
* @param sysimgfile 处理后的图片文件名前缀
*
*/ 

............................ 


public boolean CreateThumbnail() throws Exception
{
//ext是图片的格式 gif JPG 或png
String ext="";
double Ratio=0.0;
File F = new File(fromdir,imgfile);
if (!F.isFile())
throw new Exception(F+" is not image file error in CreateThumbnail!");

//首先判断上传的图片是gif还是JPG ImageIO只能将gif转换为png
if (isJpg(imgfile)){
ext="jpg";
}else{
ext="png"; 
}
File ThF = new File(todir,sysimgfile+"."+ext); 


BufferedImage Bi = ImageIO.read(F);
//假设图片宽 高 最大为120 120
Image Itemp = Bi.getScaledInstance (120,120,Bi.SCALE_SMOOTH);


if ((Bi.getHeight()>120) || (Bi.getWidth()>120)){
if (Bi.getHeight()>Bi.getWidth())
Ratio = 120.0/Bi.getHeight();
else
Ratio = 120.0/Bi.getWidth();
}


AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(Ratio, Ratio), null);
Itemp = op.filter(Bi, null);

try {
ImageIO.write((BufferedImage)Itemp, ext, ThF);
}catch (Exception ex) {
throw new Exception(" ImageIo.write error in CreatThum.: "+ex.getMessage()); 
}
return (true);
}
}

 

#7


public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  {
    response.setContentType("text/html;charset=gb2312");
    PrintWriter out = response.getWriter();
    String titleid="1";//标题id
    String fileName=new String();//上传的文件名称
    dbConn db=new dbConn();
    try
    {
      System.out.println("开始上传附件");
      SmartUpload mySmartUpload = new SmartUpload();

      ResultSet rs=null;
      mySmartUpload.initialize(config, request, response);
      mySmartUpload.setMaxFileSize(1024 * 1024 * 10);//上传文件最大尺寸
      mySmartUpload.upload();//上传
      Enumeration enumer=mySmartUpload.getRequest().getParameterNames();
      String strsql=new String();//sql语句
      for (int i=0;i<mySmartUpload.getFiles().getCount();i++)//循环上传附件
      {
        com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);//取得文件
        fileName=myFile.getFileName();//取得文件名
        //String filetype=mySmartUpload.getFiles().getFile(i).getFileExt();//获取后缀名
        if(!myFile.isMissing())
        {
          myFile.saveAs("uploadfile/"+fileName);//保存上传的文件到服务器的uploadfile目录下
          System.out.println("文件名:"+fileName);//后台显示文件名
         // java.io.File sfile=new java.io.File(request.getRealPath("")+"\\uploadfile\\"+fileName);//创建文件对象
         // java.io.InputStream inStream=new java.io.FileInputStream(sfile);//将文件读到流中
          int fileSize=myFile.getSize();//获取文件大小(字节)
          if(fileSize>mySmartUpload.getSize())
          {
            System.out.println("上传文件过大!");
            int err=1/0;
          }
          System.out.println("文件大小:"+(int)(fileSize/1024)+"KB");//后台显示文件大小
          if(fileSize!=0)
          {
            String contenttype = myFile.getContentType();//获得文件类型
            System.out.println("文件类型:"+contenttype);//后台显示文件类型
            String blobzd=new String();//blob字段名
            if(!contenttype.trim().equals("image/pjpeg") && !contenttype.trim().equals("image/gif"))
            {
              System.out.println("上传的文件不是规定格式的图片!");
              throw new Exception("上传的文件不是规定格式的图片");
            }
            String sql="insert into tblpicture values(?,?,?,?)";
            String sFilePath="\\bea\\wlserver6.1\\config\\mydomain\\applications\\DefaultWebApp\\uploadfile\\"+fileName;
            db.WriteFile(1,sFilePath,contenttype,sql);

          /*   
           strsql="insert into tblpicture(id,titleid,num,picture,img,thumbnail) values(pictureid.nextval,"+titleid+","+fileSize+",'"+contenttype.trim()+"',empty_blob(),empty_blob())";//插入一条空图片数据进图片表
            System.out.println(strsql);
            db.executeUpdate(strsql);
            System.out.println("-------生成缩略图---------------");
            //------------生成缩略图------------------//
            BufferedImage image;
            Image img=null;
            Toolkit tk=Toolkit.getDefaultToolkit();
            Applet app=new Applet();
            MediaTracker mt = new MediaTracker(app);
            img=tk.getImage(request.getRealPath("")+"\\uploadfile\\"+fileName);//获取原始图
            mt.addImage(img, 0);
            mt.waitForID(0);
            double rate1=((double)img.getWidth(null))/120.0+0.1;
            double rate2=((double)img.getHeight(null))/120.0+0.1;
            double rate=rate1>rate2?rate1:rate2;
            int new_w=(int)(((double)img.getWidth(null))/rate);
            int new_h=(int)(((double)img.getHeight(null))/rate);
            BufferedImage buffImg = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
            Graphics g = buffImg.createGraphics();
            g.setColor(Color.white);
            g.fillRect(0,0,new_w,new_h);
            g.drawImage(img,0,0,new_w,new_h,null);//绘制缩略图
            System.out.println("-------绘制缩略图---------------");
            g.dispose();
            java.io.OutputStream tempout=null;
            java.io.File tempfile=new java.io.File(request.getRealPath("")+"\\uploadfile\\"+fileName+"_small.jpg");
            tempout= new FileOutputStream(tempfile);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
            encoder.encode(buffImg);
            if(tempout!=null)tempout.close();
            //------------缩略图生成完毕----------------//
            //------------缩略图入库-------------------//
            System.out.println("--------缩略图生成完毕-------");
            java.io.InputStream tempinstream=new java.io.FileInputStream(tempfile);//将缩略图文件读到流中
            System.out.println("--------将缩略图文件读到流中-------");
            strsql="select thumbnail from tblpicture where titleid="+titleid+" and dbms_lob.getlength(thumbnail)=0 for update ";//选择图片表的缩略图字段更新
            rs=db.executeQuery3(strsql);
             System.out.println("------写缩略图数据进blob类型字段-----");
            if (rs !=null && rs.next())//写缩略图数据进blob类型字段
            {
              System.out.println("缩略图入库!!!!!!");
              oracle.sql.BLOB tempblob=((oracle.jdbc.OracleResultSet)rs).getBLOB("thumbnail");
              System.out.println("aaaaaaaaaaaaaaaaaa!");
              tempout = tempblob.getBinaryOutputStream();
              byte[] tempbytes = new byte[(int) tempfile.length()];//创建缓冲区
              tempinstream.read(tempbytes);
              tempout.write(tempbytes);
              tempout.flush();
              db.commit();
              if(tempout!=null)tempout.close();
            }
            if(tempinstream!=null)tempinstream.close();
            if(tempfile!=null){if(tempfile.delete())System.out.println("缩略图入库完毕!临时文件已删除!");}//删除缩略图临时文件
            //---------------缩略图入库完毕-------------//
            strsql="select img from tblpicture where titleid="+titleid+" and dbms_lob.getlength(img)=0 for update ";//选择图片表的图片字段更新
            rs=db.executeQuery3(strsql);
            if (rs !=null && rs.next())//写数据进blob类型字段
            {
              oracle.sql.BLOB blob=((oracle.jdbc.OracleResultSet)rs).getBLOB(blobzd);
              java.io.OutputStream outStream = blob.getBinaryOutputStream();
              byte[] bytes = new byte[fileSize];//创建缓冲区
              inStream.read(bytes);
              outStream.write(bytes);
              outStream.flush();
              db.commit();
              if(outStream!=null)outStream.close();
            }
            */
          }
         // if(inStream!=null)inStream.close();
          //if(sfile!=null){if(sfile.delete())System.out.println("临时文件已删除");}//删除临时文件
        }
      }

      System.out.println("文件上传完毕");
    }
    catch(Exception ex1)
    {
      System.out.println(ex1.toString());
    }

#8


mark:)

#9


Graphics 对象是不是要依赖于图像环境的操作系统才能创建啊

#10


谢谢各位兄弟了,给分!