package com.cosmocode.image.filtering.servlet; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.StringTokenizer; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import com.cosmocode.image.filtering.ImageFiltering; import com.cosmocode.image.filtering.JAIImageFiltering; import com.cosmocode.image.filtering.filters.BorderImageFilter; import com.cosmocode.image.filtering.filters.CropImageFilter; import com.cosmocode.image.filtering.filters.InvertImageFilter; import com.cosmocode.image.filtering.filters.RotateImageFilter; import com.cosmocode.image.filtering.filters.ScaleImageFilter; /** * * Parameter, die dem servlet uebergeben werden koennen: * <table> * <tr> * <td><b>Parameter</b></td> * <td><b>Wert</b></td> * <td><b>Beschreibung</b></td> * </tr> * <tr> * <td>url</td> * <td>beliebig</td> * <td>Dokument, welches nach dem filtern aufgerufen werden soll. Dabei handelt es sich in den meisten Faellen um das * gleiche Dokument, welches das Servlet im form-Tag aufruft.</td> * </tr> * <tr> * <td>filein</td> * <td>file</td> * <td>Datei, welches gefiltert werden soll</td> * </tr> * <tr> * <td>fileout</td> * <td>file | empty</d> * <td>Wenn keine Datei angegeben wird, wird <i>filein</i> ueberschrieben.</td> * </tr> * <tr> * <td>outformat</td> * <td>jpeg | bmp | fpx | png | pnm | tiff | empty</d> * <td>wenn keins angegeben ist, dann wird das eingangsformat benutzt</td> * </tr> * </table> * <br> * Filter-Parameter, die dem servlet uebergeben werden koennen: * <table> * <tr> * <td><b>Parameter</b></td> * <td><b>Wert</b></td> * <td><b>Beschreibung</b></td> * <td><b>Beispiel</b></td> * </tr> * <tr> * <td>filter_quality</td> * <td>0.0 - 1.0</td> * <td>setzt die qualitaet des bildes (hat nur effekt bei jpeg)</td> * <td>filter_quality=0.5</td> * </tr> * <tr> * <td>filter_dimension</td> * <td>width*height</td> * <td>setzt neue breite und hoehe fuer das bild</td> * <td>filter_dimension=150*233 | filter_dimension=150* (ratio beibehalten) | filter_dimension=*150 (ratio beibehalten)</td> * </tr> * <tr> * <td>filter_scale</td> * <td>percent (0.0-1.0)</td> * <td>scaliert das Bild</td> * <td>filter_scale=0.1</td> * </tr> * <tr> * <td>filter_rotate</td> * <td>angle (0.0-1.0)</td> * <td>rotiert das Bild</td> * <td>filter_rotate=0.5</td> * </tr> * <tr> * <td>filter_border</td> * <td>border (int-value)</td> * <td>malt einen rahmen um das bild</td> * <td>filter_border=10</td> * </tr> * <tr> * <td>filter_crop</td> * <td>x,y,w,h (float-value)</td> * <td>schneidet ein teil des bildes aus</td> * <td>filter_crop=0.0,10.0,100.0,100.0</td> * </tr> * <tr> * <td>filter_invert</td> * <td>0 | 1</td> * <td>invertiert das bild</td> * <td>filter_invert=on</td> * </tr> * </table> * * @version $Id: FilterServlet.java,v 1.3 2005/01/05 12:03:19 rademacher Exp $ */ public class FilterServlet extends HttpServlet { private static final long serialVersionUID = 1736328756120697692L; public static final String cvsID = "$Id: FilterServlet.java,v 1.3 2005/01/05 12:03:19 rademacher Exp $"; static Logger logger = Logger.getLogger( FilterServlet.class ) ; static final String TMP_DIR = "/tmp/"; static final String[] errorStr = { "FILE_EXISTS", "NULL_REQUEST", "NO_TMP", "MAXPOSSIZE", "READONLY", "WRONG_POST_TYPE", "FILE_TOO_BIG", "WRONG_DATA", "NO_BOUNDARY", "MALFORMED_LINE", "CONTENT_CORRUPT" }; public void doGet( HttpServletRequest request, HttpServletResponse resp ) throws ServletException { try { doPost( request, resp ) ; } catch ( Exception e) { throw new ServletException ( e ) ; } } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setStatus( HttpServletResponse.SC_OK ); res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<HTML><BODY>"); String url = req.getParameter("url"); String filein = req.getParameter("filein") ; String fileout = req.getParameter("fileout") ; String outformat = req.getParameter("outformat") ; if ( outformat==null || outformat.equals("") ) outformat = (fileout!=null && !fileout.equals("") ? fileout.substring( fileout.lastIndexOf(".")+1 ) : filein.substring( filein.lastIndexOf(".")+1 ) ) ; String filter_quality = req.getParameter("filter_quality") ; String filter_dimension = req.getParameter("filter_dimension") ; String filter_scale = req.getParameter("filter_scale") ; String filter_rotate = req.getParameter("filter_rotate") ; String filter_border = req.getParameter("filter_border") ; String filter_crop = req.getParameter("filter_crop"); String filter_invert = req.getParameter("filter_invert") ; try { ImageFiltering filtering = null ; if ( filein.startsWith("http") || filein.startsWith("ftp") ) filtering = new JAIImageFiltering( new java.net.URL( filein) ) ; else filtering = new JAIImageFiltering( filein ) ; // Filtern if ( filter_quality != null && !filter_quality.equals("") ) { filtering.setQuality( Float.parseFloat( filter_quality) ); System.err.println( "*** quality: " + filter_quality ); } if ( filter_border != null && !filter_border.equals("") ) { filtering.addFilter( new BorderImageFilter( Integer.parseInt( filter_border ) ) ); System.err.println( "*** border: " + filter_border ); } if ( filter_invert != null && !filter_invert.equals("") ) { filtering.addFilter( new InvertImageFilter( ) ); System.err.println( "*** invert: " + filter_invert ); } if ( filter_rotate != null && !filter_rotate.equals("") ) { filtering.addFilter( new RotateImageFilter( Float.parseFloat( filter_rotate ) ) ) ; System.err.println( "*** rotate: " + filter_rotate ) ; } if ( filter_crop != null && !filter_crop.equals("") ) { StringTokenizer st = new StringTokenizer(filter_crop,",") ; float x = Float.parseFloat( st.nextToken() ) ; float y = Float.parseFloat( st.nextToken() ) ; float w = Float.parseFloat( st.nextToken() ) ; float h = Float.parseFloat( st.nextToken() ) ; filtering.addFilter( new CropImageFilter( x,y,w,h) ) ; System.err.println( "*** rotate: " + filter_rotate ) ; } if ( filter_scale != null && !filter_scale.equals("") ) { filtering.addFilter( new ScaleImageFilter( Float.parseFloat( filter_scale ) ) ) ; System.err.println( "*** scaling per: " + filter_scale + "%" ) ; } else if ( filter_dimension != null && !filter_dimension.equals("") ) { float newW = -1.0f ; float newH = -1.0f ; String sw = filter_dimension.substring(0,filter_dimension.indexOf("*")) ; String sh = filter_dimension.substring(filter_dimension.indexOf("*")+1) ; if ( ! sw.equals("") ) newW = (float)Integer.parseInt(sw)/(float)filtering.getWidth(); if ( ! sh.equals("") ) newH = (float)Integer.parseInt(sh)/(float)filtering.getHeight(); if ( newW<0.0 ) newW = newH ; else if ( newH<0.0 ) newH = newW ; filtering.addFilter( new ScaleImageFilter( newW, newH ) ) ; System.err.println( "*** scaling to: " + newW + "/" + newH ) ; } filtering.proceedFilters() ; FileOutputStream fout = new FileOutputStream( fileout ) ; filtering.writeToStream( fout, outformat ); fout.close() ; out.println("<script> document.location.href = \""+url+"\"; </script>"); } catch (Exception e) { e.printStackTrace() ; suckContent( req ) ; url = res.encodeURL(url + "?error=" + getErrorNr( e.toString() ) ); out.println("<script> document.location.href = \""+url+"\"; </script>"); } finally { } out.println("</BODY></HTML>"); } // -- private -- private void suckContent( HttpServletRequest req ) { try { InputStream in = req.getInputStream() ; byte [] buf = new byte[ 100000 ] ; // ~ 100 k while ( 0 < in.read( buf, 0, buf.length ) ) { } } catch ( Exception e ) { e.printStackTrace(); } } private int getErrorNr(String err) { for (int i=0;i<errorStr.length;i++) { if (err.indexOf(errorStr[i])>=0) return i; } return -1; } } // end class FilterServlet ////////////////////////////////////////////////////////////////////////////////// // // $Log: FilterServlet.java,v $ // Revision 1.3 2005/01/05 12:03:19 rademacher // 0.3.0.0 // // Revision 1.2 2004/10/01 13:10:32 rademacher // 0.2.1.0 // // Revision 1.1 2004/10/01 09:33:57 rademacher // 0.2.0.1 // // //