I can across an one of my old storage hard disks which I use as backup. I plugged it in and went exploring and found a few programs PERL scripts from 1996 :). I do vaguely remember the HTML mixed code.
These 2 scripts was responsible for the download and upload of images to a image database in an Oracle database. It actually ended up serving up to 60K page-hits a day where each page contained about 5-10 pictures for a few years and performed acceptably at the time.
Pure nostalgia :)
Here is the upload script:
#!c:\oracle\oraport/Apache/perl/5.00503/bin/MSWin32-x86/perl.exe
#
# FILE NAME:
# mediaUpload.cgi
#
# DESCRIPTION:
# Script responsible for the binary upload of BLOBs over the http web protocol.
# The file will be inserted into a database as well as uploaded to a specified
# $SAVE_DIRECTORY on the webserver.
########################### User defined variables #############################
#$ENV{ORACLE_HOME} = '/u02/oracle/ora817';
#$ENV{NLS_LANG} = 'danish_denmark.we8iso8859p1';
#$ENV{ORA_NLS33} = '/u02/oracle/ora817/ocommon/nls/admin/data';
my $user = "USERNAME";
my $passwd = "PASSWORD";
my $driver = "Oracle";
my $db_name = "DATABASENAME";
my $SAVE_DIRECTORY = "/images";
my $NT_SERVER = 0;
################################################################################
use CGI qw(:standard);
my $query = new CGI;
use CGI qw(:cgi-lib);
use DBI qw(:sql_types);
# Parse arguments
local *in;
&ReadParse(*in);
# Flush StdOut
$| = 1;
# Used for debugging the scripts. If a debugging variable is sent as a
# parameter in the query_string then set debugging mode on.
if ($ENV{'QUERY_STRING'} =~ /debug/g) {
my $debugMode= $in{'debug'};
}
else {
my $debugMode = 0;
}
#print &PrintHeader;
my $dataSource = "dbi:$driver:${db_name}";
my $dbh = DBI->connect($dataSource, $user, $passwd) || die "Error connecting to database: $DBI::errstr\n";
&insert_data;
exit;
sub insert_data() {
# Upload binary data
foreach $key (sort {$a <=> $b} $query->param()) {
next if ($key =~ /^\s*$/);
next if ($query->param($key) =~ /^\s*$/);
next if ($key !~ /^media:/);
($garbage, $filenumber) = split(/:/,$key);
$filenumber =~ s/file//;
$desc = "desc" . $filenumber;
$mime = "mime" . $filenumber;
$cat = "cat" . $filenumber;
$Number = $1;
if ($query->param($key) =~ /([^\/\\]+)$/) {
$Filename = $1;
$Filename =~ s/^\.+//;
$File_Handle = $query->param($key);
$no_bytes = (stat ($File_Handle))[7];
}
undef $BytesRead;
undef $Buffer;
read ($File_Handle, $Buffer, $no_bytes);
# Get the next id from the database
my $sqlId = "
SELECT icseq_media_elements.NEXTVAL
FROM dual";
my $id = $dbh->selectrow_array( $sqlId );
$string = $File_Handle;
$string =~ s/(.*)\.(.*)//g;
$ext = $2;
# Save image to database
$sqlInsert = "
INSERT INTO ic_media_elements
(media_id,
media,
mime_type,
org_file_name,
file_size,
description,
category_id,
user_created,
date_created,
user_changed,
date_changed)
VALUES
(:media_id,
:media,
:mime_type,
:org_file_name,
:file_size,
:description,
:category_id,
:user_created,
SYSDATE,
:user_changed,
SYSDATE)";
$sth = $dbh->prepare($sqlInsert);
$sth->bind_param(":media_id", $id);
$sth->bind_param(":media", $Buffer, SQL_BINARY);
$sth->bind_param(":mime_type", $in{$mime});
$sth->bind_param(":org_file_name", $Filename);
$sth->bind_param(":file_size", $no_bytes);
$sth->bind_param(":description", $in{$desc});
$sth->bind_param(":category_id", $in{$cat});
$sth->bind_param(":user_created", "administrator");
$sth->bind_param(":user_changed", "administrator");
$sth->execute();
# Save image to file
if (!open(OUTFILE, ">$SAVE_DIRECTORY\/$id\.$ext")) {
print "Content-type: text/plain\n\n";
print "-------------------------\n";
print "Error:\n";
print "-------------------------\n";
print "File: $SAVE_DIRECTORY\/$Filename\n";
print "-------------------------\n";
print "There was an error opening the Output File\n";
print "for Writing.\n\n";
print "Make sure that the directory:\n";
print "$SAVE_DIRECTORY\n";
print "has been chmodded with the permissions '777'.\n\n";
print "Also, make sure that if your attempting\n";
print "to overwrite an existing file, that the\n";
print "existing file is chmodded '666' or better.\n\n";
print "The Error message below should help you diagnose\n";
print "the problem.\n\n";
print "Error: $!\n";
exit;
}
if ($NT_SERVER) {
binmode(OUTFILE);
}
{next;}
print OUTFILE $Buffer;
close(OUTFILE);
push(@Files_Written, "$SAVE_DIRECTORY\/$Filename");
$TOTAL_BYTES += $no_bytes;
$Confirmation{$File_Handle} = $no_bytes;
close($File_Handle);
$FILES_UPLOADED = scalar(keys(%Confirmation));
}
print header;
print <<__END_OF_HTML_CODE__;
<html>
<head>
<title>Resultat af data upload</title>
<link rel="stylesheet" href="/cm.css/CMfont.css" type="text/css">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<table width="560" border="1" cellspacing="0" align="center">
<tr bgcolor="#FFFF00">
<td colspan="3" class="divText">
Du har uploadet de følgende <b>$FILES_UPLOADED</b> fil(er) til $driver databasen "$db_name".<BR>
Den totale datamængde var på <B>$TOTAL_BYTES</B> bytes.<BR>
</td>
</tr>
<tr bgcolor="#CCCCCC">
<td width="400" class="divTextH2">Fil</td>
<td width="160" class="divTextH2">Størrelse </td>
</tr>
__END_OF_HTML_CODE__
foreach $key (keys (%Confirmation)) {
print <<__END_OF_HTML_CODE__;
<tr bgcolor="#FFFFFF">
<td width="400" class="divText">$key</td>
<td align=right width="160" >$Confirmation{$key} bytes</td>
<tr>
__END_OF_HTML_CODE__
}
print <<__END_OF_HTML_CODE__;
</TABLE>
</body>
</html>
__END_OF_HTML_CODE__
exit;
} and the download script
#!c:\oracle\oraport/Apache/perl/5.00503/bin/MSWin32-x86/perl.exe
#
# FILE NAME:
# media.cgi
#
#
# DESCRIPTION:
# Retrieves an media elements (jpeg, gif, mov ..) from the database and shows
# it in the same way as if it had been on the filesystem.
#
# ABSTRACT:
# Based on a 'page_id' and the 'insert_area_name' sent as parameters issue an
# SQL to the database retrieve media and the mime_type columns from the specific
# row found.
#
#
# HISTORY:
# Date Developer Version Description Of Changes Made
# ---- --------- ------- ---------------------------
# 14/7-2001 Kenneth Thorman 1.0 Original
########################### User defined variables #############################
$ENV{ORACLE_HOME} = '/u02/oracle/ora817';
$ENV{NLS_LANG} = 'danish_denmark.we8iso8859p1';
$ENV{ORA_NLS33} = '/u02/oracle/ora817/ocommon/nls/admin/data';
my $user = "USERNAME";
my $passwd = "PASSWORD";
my $driver = "Oracle";
my $db_name = "DATABASENAME";
################################################################################
use CGI qw(:standard, :cgi-lib);
use DBI qw(:sql_types);
$query = new CGI;
local *in;
&ReadParse(*in);
$dataSource = "dbi:$driver:${db_name}";
$dbh = DBI->connect($dataSource, $user, $passwd);
# Make sure buffer is big enough for CLOB, BLOB (200KB)
$dbh->{LongReadLen}= 200 * 1024;
# SQL statement to select an media based on page_id, and insert_area_name
$sql = "
SELECT media, mime_type
FROM ic_media_elements
WHERE media_id = :media_id";
$sth = $dbh->prepare($sql);
# Bind the input values to named place holders to allow for caching
$sth->bind_param(":media_id", $in{'media_id'});
$sth->execute();
# Binding output columns to minimize variables used.
$sth->bind_col( 1, \$media );
$sth->bind_col( 2, \$mime_type );
$sth->fetch();
print $query->header($mime_type), $media;
$sth->finish;
$dbh->disconnect;