1 package com.quadcap.app.dbimage; 2 3 40 41 import java.io.ByteArrayOutputStream ; 42 import java.io.IOException ; 43 import java.io.InputStream ; 44 import java.io.OutputStream ; 45 46 import java.util.Enumeration ; 47 import java.util.Properties ; 48 49 import java.sql.Connection ; 50 import java.sql.DatabaseMetaData ; 51 import java.sql.DriverManager ; 52 import java.sql.PreparedStatement ; 53 import java.sql.ResultSet ; 54 import java.sql.Statement ; 55 import java.sql.SQLException ; 56 57 import javax.servlet.ServletConfig ; 58 import javax.servlet.ServletException ; 59 60 import javax.servlet.http.HttpServlet ; 61 import javax.servlet.http.HttpServletRequest ; 62 import javax.servlet.http.HttpServletResponse ; 63 64 import java.awt.Image ; 66 import java.awt.Graphics2D ; 67 import java.awt.geom.AffineTransform ; 68 import java.awt.image.BufferedImage ; 69 import java.io.IOException ; 70 import java.io.OutputStream ; 71 import java.io.FileOutputStream ; 72 import javax.swing.ImageIcon ; 73 import com.sun.image.codec.jpeg.JPEGCodec; 74 import com.sun.image.codec.jpeg.JPEGImageEncoder; 75 76 81 public class DbImageServlet extends HttpServlet { 82 String url = null; 83 84 public void init(ServletConfig config) throws ServletException { 85 super.init(config); 86 try { 87 url = config.getInitParameter("jdbc.url"); 88 if (url == null) { 89 throw new ServletException ("No jdbc.url property"); 90 } else { 91 String driver = "com.quadcap.jdbc.JdbcDriver"; 92 String d = config.getInitParameter("jdbc.driver"); 93 if (d != null) driver = d; 94 Class.forName(driver); 95 } 96 config.getServletContext().setAttribute("servlet", this); 97 98 Connection conn = getConnection(); 99 Statement stmt = conn.createStatement(); 100 try { 101 DatabaseMetaData dbmeta = conn.getMetaData(); 102 ResultSet rs = dbmeta.getTables(null, null, "images", null); 103 if (!rs.next()) { 104 stmt.execute( 105 "create table images(" + 106 " name varchar(99999), " + 107 " maxDim int, " + 108 " data blob," + 109 " size int)"); 110 stmt.execute( 111 "create unique index images1 on images(name, maxDim)"); 112 } 113 rs.close(); 114 } finally { 115 stmt.close(); 116 conn.close(); 117 } 118 119 } catch (Exception e) { 120 e.printStackTrace(System.err); 121 throw new ServletException (e); 122 } 123 } 124 125 public Connection getConnection() throws SQLException { 126 Properties p = new Properties (); 127 p.put("create", "true"); 128 return DriverManager.getConnection(url, p); 129 } 130 131 byte[] resizeImage(byte[] imageBytes, int maxDim) throws IOException { 132 ImageIcon inImage = new ImageIcon (imageBytes); 133 134 double scale = (double)maxDim/(double)inImage.getIconHeight(); 136 137 if (inImage.getIconWidth() > inImage.getIconHeight()) { 138 scale = (double)maxDim/(double)inImage.getIconWidth(); 139 } 140 141 int scaledW = (int)(scale*inImage.getIconWidth()); 144 int scaledH = (int)(scale*inImage.getIconHeight()); 145 146 BufferedImage outImage = new BufferedImage (scaledW, scaledH, 148 BufferedImage.TYPE_INT_RGB); 149 150 AffineTransform tx = new AffineTransform (); 152 153 if (scale < 1.0d) { 156 tx.scale(scale, scale); 157 } 158 159 Graphics2D g2d = outImage.createGraphics(); 161 g2d.drawImage(inImage.getImage(), tx, null); 162 g2d.dispose(); 163 164 ByteArrayOutputStream os = new ByteArrayOutputStream (); 166 JPEGImageEncoder encoder = 167 JPEGCodec.createJPEGEncoder(os); 168 encoder.encode(outImage); 169 170 return os.toByteArray(); 171 } 172 173 void sendImage(byte[] image, HttpServletResponse response) 174 throws ServletException , IOException 175 { 176 OutputStream os = response.getOutputStream(); 177 response.setContentLength(image.length); 178 os.write(image); 179 } 180 181 void storeImage(Connection conn, byte[] image, String name, int dim) 182 throws SQLException 183 { 184 PreparedStatement p = conn.prepareStatement( 185 "insert into images(?,?,?,?)"); 186 p.clearParameters(); 187 p.setString(1, name); 188 p.setInt(2, image.length); 189 p.setBytes(3, image); 190 p.setInt(4, dim); 191 p.executeUpdate(); 192 p.close(); 193 } 194 195 public void doGet(HttpServletRequest request, 196 HttpServletResponse response) 197 throws ServletException 198 { 199 String s = request.getServletPath(); 200 response.setContentType(getServletContext().getMimeType(s)); 201 Connection conn; 202 try { 203 conn = getConnection(); 204 } catch (SQLException ex) { 205 throw new ServletException (ex); 206 } 207 int dim = -1; 208 String mdim = request.getParameter("maxDim"); 209 if (mdim != null) { 210 dim = Integer.parseInt(mdim); 211 } 212 try { 213 Statement stmt = conn.createStatement(); 214 if (dim <= 0) { 215 ResultSet rs = stmt.executeQuery( 216 "select data from images where name = '" + s + 217 "' and maxDim <= 0"); 218 if (rs.next()) { 219 byte[] image = rs.getBytes(1); 220 rs.close(); 221 sendImage(image, response); 222 } else { 223 rs.close(); 224 } 226 } else { 227 ResultSet rs = stmt.executeQuery( 228 "select data from images where name ='" + s + 229 "' and maxDim = " + dim); 230 if (rs.next()) { 231 byte[] image = rs.getBytes(1); 232 rs.close(); 233 sendImage(image, response); 234 } else { 235 rs.close(); 236 rs = stmt.executeQuery( 237 "select data, size from images where name = '" + s + 238 "' and maxDim <= 0"); 239 if (rs.next()) { 240 byte[] image = rs.getBytes(1); 241 rs.close(); 242 byte[] resized = resizeImage(image, dim); 243 storeImage(conn, resized, s, dim); 244 sendImage(resized, response); 245 } else { 246 rs.close(); 248 } 249 } 250 } 251 } catch (Throwable t) { 252 throw new ServletException (t); 253 } finally { 254 try { 255 conn.close(); 256 } catch (Throwable t) { 257 throw new ServletException (t); 258 } 259 } 260 } 261 262 } 263 | Popular Tags |