Hi all! I am using Struts from about half a year, and it works good. I have small webapp using Interbase database by Interclient driver. When I wanted to use only text data from queries all was fine and simply, even when "single" jpegs from blob fields. But now I must display some images on one page and I have some errors with doing that.
My action classes do their work in "normal" way - using database connection they get data by ResultSets, transfer them to my java beans, and jsp page is responsible for formatting and displaying this data. But, like I've told it is related only to text data. All pages till now displayed no more than one image from database. To achieve that, on required jsp pages is placed <html:img> tag with proper properties (ie. image id) which is linked to special action (ImageAction) descendant properly configured in "struts.xml" file. His work is to: - extract parameters from request (imageid=87) - get one-row ResultSet (rs) with image (select image from images where imageid=87) - gets this image by rs.getBinaryStream(1) - copy this stream to ServletOutputStream - set response mime type and len - send response by closing its output stream (code of this class is attached below) When I need one image on browser page then jsp page contains one tag <html:img page="/smallImage.do?imageid=87" />. And all works FINE. SmallImage action simply calls ImageAction. Requests from users goes to server not often. But now I need display html-table with five images and this technique not work. Jsp page contains <table> <tr> <td><html:img page="/smallImage.do?imageid=87" /></td> <td><html:img page="/smallImage.do?imageid=88" /></td> </tr> <tr> <td><html:img page="/smallImage.do?imageid=89" /></td> <td><html:img page="/smallImage.do?imageid=90" /></td> </tr> </table> As you see one big change to previous page is that ActionImage class is called four times to fill one page, and this request goes to server almost at once. Errors suggest me, that responsible for this situation goes from ImageAction to Interclient, but I'm not sure. Generally most frequently I get no images, sometimes only one image, but never all four required. All images in database table are in good format, because when I want to get only one image on page they are displayed correctly. So I've started my investigation on "How ImageAction doesn't work correctly". I've put into ImageAction class some additional code to write out whats going on. I must say that it looks like action gets four request, starts "simultaneously" create statements, and gets ResultSets. Problems is when its starts to copy "blob" stream (place is marked in code). I've get "JDBC IOException: Invalid operation to read on closed blob stream. See API reference for exception interbase.interclient.BlobIOEception". All subsequent tries to copy ends with error "[interclient] Client/server protocol error: Unexpected token in network message received from Interserver. The internal code is 101. See Api reference for exception interbase.interclient.RemoteProtocolException". Connection to database is broken. QUESTIONS: 1. Is it possible that Interclient driver doesn't support Blobs in multithread way? 2. Should I change the database engine? 3. Or should I make some trick to collect only one image at a time ? How can I achieve that ? 4. Or what am I doing wrong? Maybe not synchronizing but I dont understand this very well. 5. Can anybody help me at all? My configuration Tomcat 4.0, Interbase 6.0.1.6 (Open Source) My code for ImageAction package jd.struts.images; import org.apache.struts.action.*; import javax.servlet.http.*; import javax.servlet.*; import java.io.*; import java.sql.*; public class ImageAction extends Action { public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String sParam = request.getParameter("imageid"); try{ Integer iParam = new Integer(sParam); int i = iParam.intValue(); if (i>0){ HttpSession session=request.getSession(); Connection connection = (Connection)session.getAttribute("connection"); if (connection!=null){ try { Statement st = connection.createStatement(); ServletOutputStream sos = httpServletResponse.getOutputStream(); ResultSet rs = st.executeQuery("select image from umowyimages where umimageid=" + i); if (rs.next()) { InputStream is = rs.getBinaryStream(1); int len = is.available(); <--- here gives back correct blob size byte b[] = new byte[12]; while (true) { int bytes = is.read(b); <--- here appears first error if (bytes == -1) { break; } else { len += bytes; } sos.write(b, 0, bytes); } } rs.close(); st.close(); response.setContentType("image/jpeg"); response.setContentLength(len);sos.close(); } catch (Exception ex) { System.out.println(toString()+"sqlError: "+ex.getMessage()); } } else{ System.out.println(toString()+" connectionError"); } } else{ System.out.println(toString()+" paramError"); } } catch (NumberFormatException nfe) { System.out.println(toString()+" conversionError"); } return null; } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]