| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Re: BLOB's and Webserver
We had a CGI executable that did this, (on NT), here is the code if
you want.
The parameters tell it what the FILE# is for retrieval from the table
---html source for this--------------------------------------- <HR> </FORM>
<IMG SRC="/gif/upload.gif"> <BR> </center> ---C++ code --------------------------------------------------------#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
extern "C" {
#include <ociapr.h>
}
// Define the OCI datatypes
#define VARCHAR2_TYPE 1
#define NUMBER_TYPE 2
#define INT_TYPE 3
#define FLOAT_TYPE 4
#define STRING_TYPE 5
#define ROWID_TYPE 11
#define DATE_TYPE 12
#define LONG_RAW 24
#define LONG_VARRAW 95
// Define the std streams
#define STDIN 0
#define STDOUT 1
#define STDERR 2
//#define text otext
void main()
{
// Data members for the INPUT data stream
char* dataraw; // The raw data
int fileno = 0; // The file reference number
char* parmtmp; // This is a working area to extract
parameters
/*
* Begin processing the INPUT stream
*/
// Flip the stdin stream to binary mode
setmode( STDIN, _O_BINARY );
// Get the URL string and parse it out
dataraw = strlwr(strdup(getenv("PATH_INFO")));
// Pull the parameter FILENO out of the path header
parmtmp = strdup(dataraw+1);
strtok(parmtmp,"/\\");
fileno = atoi(parmtmp);
if (fileno == 0)
{
printf( "Content-Type: text/plain\n\nInvalid URL value
string\n" );
return;
}
/*
* Time for a little OCI to fetch our data!!!
*/
Cda_Def lda;
Cda_Def cda;
char hda[256];
char filetyp[50]; // The type of binary file
char filename[50]; // The name of binary file
long filelen; // The length of the binary
data
char fileext[4]; // the file extension
char* filedat; // The binary file data
char filehdr[100]; // The outstream heade
short i_fileno = 0;
short i_refno = 0;
short i_filenam = 0;
short i_filetyp = 0;
short i_filelen = 0;
short i_filedat = 0;
memset(hda,0,255);
memset(filename,0,50);
if
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Logon:", lda.rc );
if (oopen(&cda,&lda,0,-1,-1,0,-1))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Open:",
cda.rc );
if (oparse(&cda,(text*)"select len, type, name from blobtab where file# = :fileno",
-1,1,2))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Parse:",
cda.rc );
if
(obndra(&cda,(text*)":fileno",-1,(text*)&fileno,sizeof(int),INT_TYPE,-1,
&i_refno,0,0,0,0,0,-1,-1))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Bind:",
cda.rc );
if
(odefin(&cda,1,(text*)&filelen,sizeof(int),INT_TYPE,-1,&i_filelen,0,0,-1,0,0))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Define 1:", cda.rc );
if
(odefin(&cda,2,(text*)filetyp,50,STRING_TYPE,-1,&i_filetyp,0,0,-1,0,0))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Define 2:", cda.rc );
if
(odefin(&cda,3,(text*)filename,50,STRING_TYPE,-1,&i_filenam,0,0,-1,0,0))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Define 3:", cda.rc );
if (oexec(&cda))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Exec:",
cda.rc );
if (ofetch(&cda))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Fetch:",
cda.rc );
filedat = (char*) malloc(filelen);
if (oparse(&cda,(text*)"select data from blobtab where file# = :fileno",
-1,1,2))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Parse:",
cda.rc );
if
(obndra(&cda,(text*)":fileno",-1,(text*)&fileno,sizeof(int),INT_TYPE,-1,
&i_refno,0,0,0,0,0,-1,-1))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Bind:",
cda.rc );
if
(odefin(&cda,1,(text*)filedat,filelen,LONG_RAW,-1,&i_filedat,0,0,-1,0,0))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Define:",
cda.rc );
if (oexec(&cda))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Exec:",
cda.rc );
if (ofetch(&cda))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Fetch:",
cda.rc );
if (ocan(&cda))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Cancel:",
cda.rc );
if (ologof(&lda))
printf( "Content-Type: text/plain\n\n%s\t%i\n", "Logoff:",
lda.rc );
/*
* Begin processing the OUTPUT stream
*/
// Stream out the binary data to stdout
setmode( STDOUT, _O_BINARY );
// Setup the stream header
memset(fileext,0,4);
strcpy(fileext,strstr(filename,".")+1);
_strupr(fileext);
if(strcmp(fileext,"ZIP") == 0) {
strcpy(filetyp, "application/x-compressed;"); // ZIP
files...
}
else {
if(strncmp(fileext,"XL",2) == 0) {
strcpy(filetyp, "application/x-msexcel;"); //
Excel files...
}
else {
strcpy(filetyp, "application/octet-stream;");
// This was chosen aribitrarily as the default
}
}
sprintf( filehdr, "Content-Type: %sname=\"%s\"\n\n", filetyp,
filename );
// Stream out the data stream
fwrite( filehdr, 1, strlen(filehdr), stdout);
fwrite( filedat, 1, filelen, stdout);
return;
![]() |
![]() |