Re: [GENERAL] How to display stored image on web page? - Mailing list pgsql-general

From Gilles Darold
Subject Re: [GENERAL] How to display stored image on web page?
Date
Msg-id 36A31E70.4B64FA87@neptune.fr
Whole thread Raw
In response to How to display stored image on web page?  (Bernie <bfb@att.net>)
List pgsql-general
Hi,

After some request on How to display images stored as large Object with
example
I give you this perl script which is doing this very well. Just call it
from your cgi script,
Html pages, or servlet by inserting the following HREF :

<IMG SRC="http://www.monsite.com/cgi-bin/object.pl?n=1">

Of course you must have perl install in your machine and mod_perl
working with Apache.

object.pl is the name of the perl script bellow, the CGI parameter n=1
is in fact
the id of an autoincrement field I have when I insert a new image. You
can replace
it by the oid of your large object, it may work.

Here the object.pl script :

---------------------------------------------------------------------------------------

#!/usr/bin/perl
###############################################################################

# Script used to retrieved images or any binary file stored in a
PostgreSQL database.
# Param : Id of the object to return
###############################################################################

# Tested with:
#  - PostgreSQL-6.3.2
#  - apache_1.3.2
#  - mod_perl-1.08
#  - perl5.004_04

use CGI;
use Pg;
#use strict;

# Create an instance of the CGI package
my $query = new CGI;

# CGI parameters
my $n;  # The id of the object in the database
$n = $query->param('n');
if ($n eq "") {
        exit(0);
}

# SQL query and DB instance
my $DBNAME = "database_name";
my $SEL_PHOTO = "SELECT lo_export(t_object.o_photo, '/usr/tmp/image$$')
FROM t_object WHERE l_noauto=$n;";

# Connection to the database
my $conn = Pg::setdb("www.mysite.com", "5432", "","", "$DBNAME");
if ($conn->status != PGRES_CONNECTION_OK) {
    exit(2);
}

# Retrieve the binary data
my $cmd = $SEL_PHOTO;
my $result = $conn->exec($cmd);
if ($result->resultStatus != 2) {
        &errmsg_select(1, $result->resultStatus, $cmd);
}
my $ntuples = $result->ntuples;
if ($ntuples == 0) {
    exit(2);
}

# Print the right header for images (this works for jpg and gif as well)

print $query->header(-type=>'image/jpeg', -expires=>'-1d');

# Now read the file and return its datas on the fly
open(PHOTO, "/usr/tmp/image$$") || die "error opening file
/usr/tmp/image$$\n";
while (<PHOTO>) {
    print $_;
}
close(PHOTO);
# delete the temporary file
unlink("/usr/tmp/image$$");
---------------------------------------------------------------------------------------

Hope this help,

Good work...

Gilles Darold

NB: Some other question asked to me :
- Also, which do you like better, using the db to store the images or
disk?
Storing image on disk is more easy and speed, so if I store my images
into the
database, this is because I want a centralized administration.
- Have you tried using http to upload images via the browser directly
into the db?
Yes, all images stores are sent via and HTML Interface by users. For
this I also use
mod_perl. Note that this is why I have inserted an expiration time
(asap) in the header
of the previous script, because changing images need refresh.

>

Bernie wrote:

> Now that I've stored several jpg's in my
> database as large objects, I'm trying to
> display them on a web page using a java servlet.
> Im my servlet, I've changed the content type
> to image/jpeg - response.setContentType("image/jpg");
> When the web page is loaded, all I see is the ID
> number of the image.  How do you display the
> stored image on the web page?  An example in ANY
> language would be appreciated.
>
> -Thanks




pgsql-general by date:

Previous
From: "R\imi Lehn"
Date:
Subject: [GENERAL] Postgres' DBI(Pg) problems.
Next
From: Kevin Lo
Date:
Subject: Re: [GENERAL] Postgres' DBI(Pg) problems.