RE: Displaying/Pulling Images using JDBC ...

From: Joe Shevland <J(dot)Shevland(at)eclipsegroup(dot)com(dot)au>
To: "'The Hermit Hacker'" <scrappy(at)hub(dot)org>, pgsql-jdbc(at)postgresql(dot)org
Cc: peter(at)retep(dot)org(dot)uk
Subject: RE: Displaying/Pulling Images using JDBC ...
Date: 2001-05-13 12:27:23
Message-ID: C56487636E5CD4119B1E00D0B789098ADA29A3@MEL-EXCH1
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Hi Marc,

I'm not sure if you've had a successful solution worked out by now, but our
web application frequently stores and retrieves images (GIF and JPEG at this
stage) using the 7.1 (RC 4 or 5 I think) code and I haven't encountered a
problem yet. Another application stores all manner of binary files (anything
the user throws at it, PDF/Word/etc) and again, we haven't seen a problem.

Some notes on the code:

i) I use the setAutoCommit(false) method of the Connection class for all
large object dealings (select/insert/update) as this seems to be required
(ensures commits don't occur after each statement or whatever).

ii) I've tended to use setBytes() instead of setBinaryStream() in the
PreparedStatement object. Unsure if this matters, but I usally get passed an
array of bytes from the image uploading code. Streams may be more efficient
but I'm not sure if this is where the bug lies, if indeed it is a bug.

Also, if you want to try out uploading/downloading the offending image I can
give you an account on our 'WebFormX' product site to see if its works
against Postgres, basically builds online forms and you can upload form
logos/backgrounds as well as image fields.

Cheers,
Joe

> -----Original Message-----
> From: The Hermit Hacker [mailto:scrappy(at)hub(dot)org]
> Sent: Sunday, 13 May 2001 2:45 AM
> To: pgsql-jdbc(at)postgresql(dot)org
> Cc: peter(at)retep(dot)org(dot)uk
> Subject: [JDBC] Displaying/Pulling Images using JDBC ...
>
>
>
>
> Morning folks ...
>
> Been wracking our brains on this one for too long now ... have a
> client that is trying to use JDBC to pull images stored in
> the database,
> and, from what we can gather, the images are coming out
> 'truncated' ...
>
> If the client stores the images as ASCII (uuencoded) and pulls
> those out, all works well, but if he stores them as
> binary/raw images, the
> images don't come out ...
>
> If he retrieves that image using psql and stores it to a file,
> that file is fine, so apparently the backend is storing it
> properly ...
>
> According to the table schema that we have, the image is being
> stored as an 'oid' type ...
>
> In relation to the image settings, they are counting the bytes
> that the stream is going to send to the client and verifying it on the
> clients side, the numbers are not matching unless it is an ascii based
> file....
>
> Both the backend server and the JDBC drivers are v7.1 ...
>
> Now, my thought on this is that it *sounds* like the JDBC is
> hitting some sort of control character is the stream that
> tells it to stop
> sending the image ... is this possible? Some binary
> character that needs
> to somehow be trapped?
>
> Image content is a mostly a faxed document saved as .tif format.
> But it could be anything and we derive it from the file name.
> We upload
> the document to the database. Please See the source
>
> Sample of the source they are using is as follows, is
> there something
> that we are seeing:
>
> PreparedStatement prepStmt = con.prepareStatement(selectstatement);
> prepStmt.setString(1, medicalRecordId);
> ResultSet rs = prepStmt.executeQuery();
> if (rs.next()) {
> medicalRecordId = rs.getString(1);
> typeSOAP = rs.getString(2);
> code = rs.getString(3);
> String datetimetemp = rs.getString(4);
> datetime = Timestamp.valueOf(datetimetemp);
> testObject = rs.getString(5);
> testResult = rs.getString(6);
> note = rs.getString(7);
> appointmentId = rs.getString(8);
> patientId = rs.getString(9);
> test = rs.getString(10);
> category = rs.getString(11);
>
> //if(imageName == null){
> if(imageNametemp != null){
> imageName = rs.getString(12);
>
>
> BufferedInputStream bis = new
> BufferedInputStream(rs.getBinaryStream(13));
> System.out.println("value of bis"+bis.toString());
> //InputStream is = rs.getBinaryStream(13);
>
> //System.out.println("vale of inputstream"+is.toString());
>
> int TotLen=0;
>
> ByteArrayOutputStream imageOutputStream = new
> ByteArrayOutputStream(8164);
>
> byte[] b = new byte[8164];
> int len=0;
>
> try {
> while( (len = bis.read(b,0,8164)) != -1 ) {
> imageOutputStream.write(b,0,len);
>
> TotLen += len;
> }
> bis.close();
> imageAsBytes = imageOutputStream.toByteArray();
>
> System.out.println("value of baoslenght"+imageAsBytes.length);
> System.out.println("value of totlenght"+TotLen);
>
> System.out.println("vale of
> baos"+imageOutputStream.toString());
> }
> catch(IOException e) {
> }
> }
> prepStmt.close();
>
>
> Marc G. Fournier ICQ#7615664
> IRC Nick: Scrappy
> Systems Administrator @ hub.org
> primary: scrappy(at)hub(dot)org secondary:
> scrappy(at){freebsd|postgresql}.org
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
> (send "unregister YourEmailAddressHere" to
> majordomo(at)postgresql(dot)org)
>

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Joe Shevland 2001-05-13 12:37:47 RE: Why?? executeQuery() & exception: "No results were returnedby the query."
Previous Message Bruce Momjian 2001-05-12 21:38:39 Re: Re: [HACKERS] Outstanding patches