JSP上传显示图片代码

原创 2007年10月04日 17:02:00
 Apache commons-fileupload是一个很好的文件上传工具,最近使用commons-fileupload实现了图片的上传及显示,可将图片保存在指定的文件夹中,也可以将图片存放在数据库,并支持四种常用的图片格式:jpg,png,gif,bmp。
  首先,跟上传一般文件一样,需要写一个servlet来处理上传的文件,你可以修改保存路径或选择将图片保存在数据库中,只需要做简单的修改就行了,servlet代码如下:
FileUploadServlet.java
java 代码
  1. package com.ek.servlet;   
  2. import java.awt.image.BufferedImage;   
  3. import java.io.ByteArrayOutputStream;   
  4. import java.io.File;   
  5. import java.io.IOException;   
  6. import java.io.InputStream;   
  7. import java.util.Iterator;   
  8. import java.util.List;   
  9. import java.util.regex.Matcher;   
  10. import java.util.regex.Pattern;   
  11. import javax.servlet.ServletException;   
  12. import javax.servlet.http.HttpServlet;   
  13. import javax.servlet.http.HttpServletRequest;   
  14. import javax.servlet.http.HttpServletResponse;   
  15. import org.apache.commons.fileupload.FileItem;   
  16. import org.apache.commons.fileupload.FileUploadException;   
  17. import org.apache.commons.fileupload.disk.DiskFileItemFactory;   
  18. import org.apache.commons.fileupload.servlet.ServletFileUpload;   
  19. import com.ek.image.ImageUtil;   
  20. public class FileUploadServlet extends HttpServlet {   
  21.  /**  
  22.   *   
  23.   */  
  24.  private static final long serialVersionUID = 1L;   
  25.  private static String filePath = "";   
  26.  /**  
  27.   * Destruction of the servlet. 
     
  28.   */  
  29.  public void destroy() {   
  30.   super.destroy(); // Just puts "destroy" string in log   
  31.   // Put your code here   
  32.  }   
  33.  /**  
  34.   * The doPost method of the servlet. 
     
  35.   *   
  36.   * This method is called when a form has its tag value method equals to  
  37.   * post.  
  38.   *   
  39.   * @param request  
  40.   *            the request send by the client to the server  
  41.   * @param response  
  42.   *            the response send by the server to the client  
  43.   * @throws ServletException  
  44.   *             if an error occurred  
  45.   * @throws IOException  
  46.   *             if an error occurred  
  47.   */  
  48.  public void doPost(HttpServletRequest req, HttpServletResponse res)   
  49.    throws ServletException, IOException {   
  50.   res.setContentType("text/html; charset=UTF-8");   
  51.   DiskFileItemFactory factory = new DiskFileItemFactory();   
  52.   // maximum size that will be stored in memory   
  53.   factory.setSizeThreshold(4096);   
  54.   // the location for saving data that is larger than getSizeThreshold()   
  55.   factory.setRepository(new File(filePath));   
  56.   ServletFileUpload upload = new ServletFileUpload(factory);   
  57.   // maximum size before a FileUploadException will be thrown   
  58.   upload.setSizeMax(1000000);   
  59.   try {   
  60.    List fileItems = upload.parseRequest(req);   
  61.    Iterator iter = fileItems.iterator();   
  62.    // Get the file name   
  63.    String regExp = ".+////(.+//.?())$";   
  64.    Pattern fileNamePattern = Pattern.compile(regExp);   
  65.    while (iter.hasNext()) {   
  66.     FileItem item = (FileItem) iter.next();   
  67.     if (!item.isFormField()) {   
  68.      String name = item.getName();   
  69.      long size = item.getSize();   
  70.      if ((name == null || name.equals("")) && size == 0)   
  71.       continue;   
  72.      Matcher m = fileNamePattern.matcher(name);   
  73.      boolean result = m.find();   
  74.      if (result) {   
  75.       try {   
  76.        // String type =   
  77.        // m.group(1).substring(m.group(1).lastIndexOf('.')+1);   
  78.        InputStream stream = item.getInputStream();   
  79.        ByteArrayOutputStream baos = new ByteArrayOutputStream();   
  80.        byte[] b = new byte[1000];   
  81.        while (stream.read(b) > 0) {   
  82.         baos.write(b);   
  83.        }   
  84.        byte[] imageByte = baos.toByteArray();   
  85.        String type = ImageUtil.getImageType(imageByte);   
  86.        if (type.equals(ImageUtil.TYPE_NOT_AVAILABLE))   
  87.         throw new Exception("file is not a image");   
  88.        BufferedImage myImage = ImageUtil   
  89.          .readImage(imageByte);   
  90.        // display the image   
  91.        ImageUtil.printImage(myImage, type, res   
  92.          .getOutputStream());   
  93.        // save the image   
  94.        // if you want to save the file into database, do it here   
  95.        // when you want to display the image, use the method printImage in ImageUtil    
  96.        item.write(new File(filePath + "//" + m.group(1)));  
  97.          
  98.        stream.close();  
  99.        baos.close();  
  100.       } catch (Exception e) {  
  101.        e.printStackTrace();  
  102.       }  
  103.      } else {  
  104.       throw new IOException("fail to upload");  
  105.      }  
  106.     }  
  107.    }  
  108.   } catch (IOException e) {  
  109.    e.printStackTrace();  
  110.   } catch (FileUploadException e) {  
  111.    e.printStackTrace();  
  112.   }  
  113.  }  
  114.  /**  
  115.   * Initialization of the servlet. 
     
  116.   *   
  117.   * @throws ServletException  
  118.   *             if an error occure  
  119.   */  
  120.  public void init() throws ServletException {  
  121.   // Change the file path here  
  122.   filePath = getServletContext().getRealPath("/");   
  123.  }   
  124. }   
servlet中使用到一个ImageUtil类,其中封装了图片处理的实用方法,用于读写图片,代码如下:
 
ImageUtil.java
java 代码
  1. package com.ek.image;   
  2. import java.awt.Component;   
  3. import java.awt.Graphics2D;   
  4. import java.awt.GraphicsConfiguration;   
  5. import java.awt.GraphicsDevice;   
  6. import java.awt.GraphicsEnvironment;   
  7. import java.awt.Image;   
  8. import java.awt.MediaTracker;   
  9. import java.awt.image.BufferedImage;   
  10. import java.awt.image.ColorModel;   
  11. import java.awt.image.PixelGrabber;   
  12. import java.io.ByteArrayInputStream;   
  13. import java.io.IOException;   
  14. import java.io.InputStream;   
  15. import java.io.OutputStream;   
  16. import java.util.Iterator;   
  17. import javax.imageio.ImageIO;   
  18. import javax.imageio.ImageReader;   
  19. import javax.imageio.stream.MemoryCacheImageInputStream;   
  20. import net.jmge.gif.Gif89Encoder;   
  21. import org.apache.commons.logging.Log;   
  22. import org.apache.commons.logging.LogFactory;   
  23. import com.sun.imageio.plugins.bmp.BMPImageReader;   
  24. import com.sun.imageio.plugins.gif.GIFImageReader;   
  25. import com.sun.imageio.plugins.jpeg.JPEGImageReader;   
  26. import com.sun.imageio.plugins.png.PNGImageReader;   
  27. /**  
  28.  * @author Erick Kong  
  29.  * @see ImageUtil.java  
  30.  * @createDate: 2007-6-22  
  31.  * @version 1.0  
  32.  */  
  33. public class ImageUtil {   
  34.     
  35.  public static final String TYPE_GIF = "gif";   
  36.  public static final String TYPE_JPEG = "jpeg";   
  37.  public static final String TYPE_PNG = "png";   
  38.  public static final String TYPE_BMP = "bmp";   
  39.  public static final String TYPE_NOT_AVAILABLE = "na";   
  40.  private static ColorModel getColorModel(Image image)   
  41.    throws InterruptedException, IllegalArgumentException {   
  42.   PixelGrabber pg = new PixelGrabber(image, 0011false);   
  43.   if (!pg.grabPixels())   
  44.    throw new IllegalArgumentException();   
  45.   return pg.getColorModel();   
  46.  }   
  47.  private static void loadImage(Image image) throws InterruptedException,   
  48.    IllegalArgumentException {   
  49.   Component dummy = new Component() {   
  50.    private static final long serialVersionUID = 1L;   
  51.   };   
  52.   MediaTracker tracker = new MediaTracker(dummy);   
  53.   tracker.addImage(image, 0);   
  54.   tracker.waitForID(0);   
  55.   if (tracker.isErrorID(0))   
  56.    throw new IllegalArgumentException();   
  57.  }   
  58.  public static BufferedImage createBufferedImage(Image image)   
  59.    throws InterruptedException, IllegalArgumentException {   
  60.   loadImage(image);   
  61.   int w = image.getWidth(null);   
  62.   int h = image.getHeight(null);   
  63.   ColorModel cm = getColorModel(image);   
  64.   GraphicsEnvironment ge = GraphicsEnvironment   
  65.     .getLocalGraphicsEnvironment();   
  66.   GraphicsDevice gd = ge.getDefaultScreenDevice();   
  67.   GraphicsConfiguration gc = gd.getDefaultConfiguration();   
  68.   BufferedImage bi = gc.createCompatibleImage(w, h, cm.getTransparency());   
  69.   Graphics2D g = bi.createGraphics();   
  70.   g.drawImage(image, 00null);   
  71.   g.dispose();   
  72.   return bi;   
  73.  }   
  74.  public static BufferedImage readImage(InputStream is) {   
  75.   BufferedImage image = null;   
  76.   try {   
  77.    image = ImageIO.read(is);   
  78.   } catch (IOException e) {   
  79.    // TODO Auto-generated catch block   
  80.    e.printStackTrace();   
  81.   }   
  82.   return image;   
  83.  }   
  84.     
  85.  public static BufferedImage readImage(byte[] imageByte) {   
  86.   ByteArrayInputStream bais = new ByteArrayInputStream(imageByte);   
  87.   BufferedImage image = readImage(bais);   
  88.   return image;   
  89.  }   
  90.  public static void encodeGIF(BufferedImage image, OutputStream out)   
  91.    throws IOException {   
  92.   Gif89Encoder encoder = new Gif89Encoder(image);   
  93.   encoder.encode(out);   
  94.  }   
  95.  /**  
  96.   *   
  97.   * @param bi  
  98.   * @param type  
  99.   * @param out  
  100.   */  
  101.  public static void printImage(BufferedImage bi, String type,   
  102.    OutputStream out) {   
  103.   try {   
  104.    if (type.equals(TYPE_GIF))   
  105.     encodeGIF(bi, out);   
  106.    else  
  107.     ImageIO.write(bi, type, out);   
  108.   } catch (IOException e) {   
  109.    // TODO Auto-generated catch block   
  110.    e.printStackTrace();   
  111.   }   
  112.  }   
  113.  /**  
  114.   * Get image type from byte[]  
  115.   *   
  116.   * @param textObj  
  117.   *            image byte[]  
  118.   * @return String image type  
  119.   */  
  120.  public static String getImageType(byte[] textObj) {   
  121.   String type = TYPE_NOT_AVAILABLE;   
  122.   ByteArrayInputStream bais = null;   
  123.   MemoryCacheImageInputStream mcis = null;   
  124.   try {   
  125.    bais = new ByteArrayInputStream(textObj);   
  126.    mcis = new MemoryCacheImageInputStream(bais);   
  127.    Iterator itr = ImageIO.getImageReaders(mcis);   
  128.    while (itr.hasNext()) {   
  129.     ImageReader reader = (ImageReader) itr.next();   
  130.     if (reader instanceof GIFImageReader) {   
  131.      type = TYPE_GIF;   
  132.     } else if (reader instanceof JPEGImageReader) {   
  133.      type = TYPE_JPEG;   
  134.     } else if (reader instanceof PNGImageReader) {   
  135.      type = TYPE_PNG;   
  136.     } else if (reader instanceof BMPImageReader) {   
  137.      type = TYPE_BMP;   
  138.     }   
  139.     reader.dispose();   
  140.    }   
  141.   } finally {   
  142.    if (bais != null) {   
  143.     try {   
  144.      bais.close();   
  145.     } catch (IOException ioe) {   
  146.      if (_log.isWarnEnabled()) {   
  147.       _log.warn(ioe);   
  148.      }   
  149.     }   
  150.    }   
  151.    if (mcis != null) {   
  152.     try {   
  153.      mcis.close();   
  154.     } catch (IOException ioe) {   
  155.      if (_log.isWarnEnabled()) {   
  156.       _log.warn(ioe);   
  157.      }   
  158.     }   
  159.    }   
  160.   }   
  161.   if (_log.isDebugEnabled()) {   
  162.    _log.debug("Detected type " + type);   
  163.   }   
  164.   return type;   
  165.  }   
  166.  private static Log _log = LogFactory.getLog(ImageUtil.class);   
  167. }   
注意:对gif格式的图片进行处理的时候,需要另外一下jar包:gif89.jar,因为gif格式的图片不能使用ImageIO进行输出。
  如需将图片存放到数据库中,只需要修改红色部分,将图片以blob格式保存到数据库中,显示时以byte[]格式读出,使用ImageUtil.printImage()进行输出。

JSP页面使用文件上传图片并且回传显示的注意事项

***要正常实现文件上传以下步骤应该全部考虑到: *1.html中 表示文件上传控件 *2.form的enctype="multipart/form-data" *3.在Servlet类前加上 ...
  • dsl815721035
  • dsl815721035
  • 2016年10月15日 18:38
  • 6142

jsp上传图片,并加以显示

上传图片代码如下,首先是页面: Jsp代码   "java" import="java.util.*" pageEncoding="utf-8"%>  String path = ...
  • jiangguodong0215
  • jiangguodong0215
  • 2015年04月09日 21:10
  • 2279

上传图片然后显示在JSP页面上

目标:我们想要有一个JSP页面,在这个页面上,我们可以输入新闻的标题、内容、来源及图片,             点击提交按钮后,我们可以将数据存入数据库,然后,我们可以从数据库中取出相应的数据...
  • yyy_study
  • yyy_study
  • 2016年06月12日 12:53
  • 2119

jsp上传图片直接显示在页面上,写好的代码

  • 2017年08月03日 15:16
  • 24KB
  • 下载

JSP无法显示上传图片可能原因:图片中包含中文

今天在做图片上传的时候,发现自己的图片上传到项目指定文件后(注:上传图片到项目指定文件夹下,路径保存在数据库中)。后面想显示出来的时候,却一直显示不出来。 但是确实已经传上去了。 在JSP中,我使...
  • JKL852qaz
  • JKL852qaz
  • 2016年05月06日 00:57
  • 1251

JSP中图片的上传与显示

1、引言 数据库应用程序,特别是基于WEB的数据库应用程序,常会涉及到图片信息的存储和显示。通常我们使用的方法是将所要显示的图片存在特定的目录下,在数据库中保存相应的图片的名称,在JSP中建立相...
  • baggio7095586
  • baggio7095586
  • 2014年06月25日 13:35
  • 1247

图片上传JSP代码

  • 2013年04月23日 11:07
  • 3KB
  • 下载

上传图片预览java代码

  • 2010年07月09日 17:32
  • 13KB
  • 下载

JSP页面,实现上传图片即时显示效果

function setImagePreview() { var docObj = document.getElementById("doc"); var imgObjPreview = do...
  • catenl
  • catenl
  • 2015年12月12日 20:22
  • 1403

jsp实现图片的上传和下载

将图片上传 1.添加使用jar包, jspSmartUpload.jar,并导包; 2.创建jsp页面,注意必须是“post”方式提交,form标签中一定要添加enctype=”multipart...
  • doaram123
  • doaram123
  • 2017年07月19日 11:47
  • 321
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JSP上传显示图片代码
举报原因:
原因补充:

(最多只允许输入30个字)