Hi, I am using the Phoenix Upload mod located at http://www.asan.com/users/phoenix/upload. I want to make it so that you can either upload a file or send a url, like the resource center here at Gossamer Threads.
The only problem is that I get an error saying
# --------------------------------------------------------
# Definition of your database file.
%db_def = (
ID => [0, 'numer', 5, 8, 1, '', ''],
Title => [1, 'alpha', 40, 75, 1, '', ''],
URL => [2, 'alpha', 40, 75, 0, '', '^http|news|mailto|ftp'],
Date => [3, 'date', 15, 15, 1, \&get_date, ''],
Category => [4, 'alpha', 0, 150, 1, '', ''],
Description => [5, 'alpha', '40x3', 500, 0, '', ''],
'Contact Name' => [6, 'alpha', 40, 75, 1, '', ''],
'Contact Email' => [7, 'alpha', 40, 75, 1, '', '.+@.+\..+'],
Hits => [8, 'numer', 10, 10, 1, '0', '\d+'],
isNew => [9, 'alpha', 0, 5, 0, 'No', ''],
isPopular => [10, 'alpha', 0, 5, 0, 'No', ''],
Rating => [11, 'numer', 10, 10, 1, 0, '^[\d\.]+$'],
Votes => [12, 'numer', 10, 10, 1, 0, '^\d+$'],
ReceiveMail => [13, 'alpha', 10, 10, 1, 'Yes', 'No|Yes']
);Here is my added part to links.cfg
# Uploaded File Settings
# --------------------------------------------------------
# PATH and URL to directory where Attached Files will be stored.
# (make sure you create this directory on your server) No Trailing slash.
$build_attach_path = "$build_root_path/Attach";
$build_attach_url = "$build_root_url/Attach";
# Name of the field in your links.db where the URL of the uploaded
# file will be stored
$attach_file_field = "URL";
# Do you want this to be a required field? 1=Yes 0=No
$attach_field_required = 0;
# Maximum size for file attachments (in KB)
$attach_file_size = "2000";
# List of allowable file extensions. If the file does not have one of the extensions
# listed, it will not be saved to the server. The format for the setting is
# \.extension$
# If you want to allow more than one extension, separate the options by
# a | character. On a UNIX server, these are case sensitive.
$attach_ext = '\.zip$|\.ZIP$';And here is my modified add.cgi
# -------------
# Links
# -------------
# Links Manager
#
# File: add.cgi
# Description: Adds a record marked unvalidated to the database and
# optionally emails someone.
# Author: Alex Krohn
# Email: alex@gossamer-threads.com
# Web: http://www.gossamer-threads.com/
# Version: 2.0
#
# (c) 1998 Gossamer Threads Inc.
#
# This script is not freeware! Please read the README for full details
# on registration and terms of use.
# =====================================================================
#
# Setup Notes:
# Make sure the require statement below points to the config file.
# Required Librariers
# --------------------------------------------------------
eval {
($0 =~ m,(.*)/[^/]+,) && unshift (@INC, "$1"); # Get the script location: UNIX /
($0 =~ m,(.*)\\[^\\]+,) && unshift (@INC, "$1"); # Get the script location: Windows \
require "admin/links.cfg"; # Change this to full path to links.cfg if you have problems.
require "$db_lib_path/db_utils.pl";
require "$db_lib_path/links.def";
$build_use_templates ?
require "$db_lib_path/site_html_templates.pl" :
require "$db_lib_path/site_html.pl";
};
if ($@) {
print "Content-type: text/plain\n\n";
print "Error including libraries: $@\n";
print "Make sure they exist, permissions are set properly, and paths are set correctly.";
exit;
}
# ========================================================
eval { &main; }; # Trap any fatal errors so the program hopefully
if ($@) { &cgierr("fatal error: $@"); } # never produces that nasty 500 server error page.
exit; # There are only two exit calls in the script, here and in in &cgierr.
sub main {
# --------------------------------------------------------
local (%in) = &get_file_and_form();
# We are processing the form.
if (keys %in != 0) {
&process_form;
}
# Otherwise we are displaying the form (in site_html.pl).
else {
if ($db_single_category) {
my %is_valid = map { $_ => 1 } &category_list;
$ENV{'HTTP_REFERER'} =~ s,/[^/]+\.[^/]+$,,;
$ENV{'HTTP_REFERER'} =~ m,$build_root_url/(.+?)/?$,;
$is_valid{$1} ? &site_html_add_form ($1) : &site_html_add_form ();
}
else {
&site_html_add_form ();
}
}
}
sub process_form {
# --------------------------------------------------------
my ($key, $status, $line, $output);
# Check the referer.
if (@db_referers and $ENV{'HTTP_REFERER'}) {
$found = 0;
foreach (@db_referers) {
$ENV{'HTTP_REFERER'} =~ /$_/i and $found++ and last;
}
if (!$found) {
&site_html_add_failure ("Auto submission is not allowed in this directory. Please visit the site to add your entry.");
return;
}
}
# This will set system fields like Validated to their proper values.
foreach $key (keys %add_system_fields) {
$in{$key} = $add_system_fields{$key};
}
# Set date variable to today's date.
$in{$db_cols[$db_modified]} = &get_date;
open (ID, "<$db_links_id_file_name") or &cgierr("error in process_form. unable to open id file: $db_links_id_file_name. Reason: $!");
$in{$db_key} = <ID> + 1; # Get next ID number
close ID;
# Validate the form input..
$status = &validate_record(%in);
if ($status eq "ok") {
if ($attach_field_required) {
if (!$in{$attach_file_field}) {
if (!$in{'FILE_CONTENT'}) {
&site_html_add_failure ("You must either attach a file or enter data in the $attach_file_field field.");
return;
}
}
}
# Save any attachments
if ($in{'FILE_CONTENT'}) {
if ($in{$attach_file_field}) {
&site_html_add_failure("Please do not enter both a URL and a file. If you choose to upload a file, a URL will be automatically attached.");
return;
}
if (length($in{'FILE_CONTENT'}) > ($attach_file_size * 1000)) {
&site_html_add_failure("Maximum attachment size is $attach_file_size KB. Please reduce the size of your file or email it as an attachment to $db_admin_email.");
return;
}
my $filename = $in{'FILE_NAME'};
($filename =~ m,[/\\]([^/\\]+)$,) and ($filename = $1);
if ($filename !~ /^[\w\d\.\/\\]+$/) {
&site_html_add_failure ("Invalid characters in filename '$filename'. Please use letters, numbers and dashes only.");
return;
}
if ($filename =~ /\.\./) {
&site_html_add_failure ("Invalid characters in filename '$filename'. Please use letters, numbers and dashes only.");
return;
}
if ($filename !~ /$attach_ext/) {
$attach_ext =~ s/\\//g;
$attach_ext =~ s/\$//g;
@ext = split (/\Q|\E/o,$attach_ext);
$attach_ext = join(" or ",@ext);
&site_html_add_failure ("Only files with the following extension(s) are allowed: $attach_ext");
return;
}
open (FILE, ">$build_attach_path/$in{$db_key}-$filename") or &cgierr ("Can't save attach: $build_attach_path/$in{$db_key}-$filename. Reason: $!");
print FILE $in{'FILE_CONTENT'};
close FILE;
$in{$attach_file_field} = "$build_attach_url/$in{$db_key}-$filename";
}
# Update the counter.
open (ID, ">$db_links_id_file_name") or &cgierr("error in get_defaults. unable to open id file: $db_links_id_file_name. Reason: $!");
flock(ID, 2) unless (!$db_use_flock);
print ID $in{$db_key}; # update counter.
close ID; # automatically removes file lock
# Print out the validate input to a "validation database" where it is stored until
# the admin decides to add it into the real database.
open (VAL, ">>$db_valid_name") or &cgierr("error in add_record. unable to open validate file: $db_valid_name. Reason: $!");
flock(VAL, 2) unless (!$db_use_flock);
print VAL &join_encode(%in);
close VAL; # automatically removes file lock
# Send the admin an email message notifying of new addition.
&send_email;
# Send the visitor to the success page.
&site_html_add_success;
}
else {
&site_html_add_failure($status);
}
}
sub send_email {
# --------------------------------------------------------
# Sends an email to the admin, letting him know that there is
# a new link waiting to be validated. No error checking as we don't
# want users to see the informative &cgierr output.
# Check to make sure that there is an admin email address defined.
$db_admin_email or &cgierr("Admin Email Address Not Defined in config file!");
my $to = $db_admin_email;
my $from = $in{$db_cols[$db_contact_email]};
my $subject = "Addition to Database: $in{'Title'}\n";
my $msg = qq|
The following link is awaiting validation:
Title: $in{'Title'}
URL: $in{'URL'}
Category: $in{'Category'}
Description: $in{'Description'}
Contact Name: $in{'Contact Name'}
Contact Email: $in{'Contact Email'}
Remote Host: $ENV{'REMOTE_HOST'}
Referer: $ENV{'HTTP_REFERER'}
To validate, please go to:
$db_script_url
Sincerely,
Links Manager.
|;
# Then mail it away!
require "$db_lib_path/Mailer.pm";
my $mailer = new Mailer ( { smtp => $db_smtp_server,
sendmail => $db_mail_path,
from => $from,
subject => $subject,
to => $to,
msg => $msg,
log => $db_mailer_log
} ) or return;
$mailer->send or return;
}
sub get_file_and_form {
# --------------------------------------------------------
# Code taken from WWWThreads 3.2 based off of work by Steve Hsueh
# and Rick Baker.
#
my ($i, $loc, $key, $val, $input, %ATTACH, $f,$header, $header_body, $len, $buf);
if( $ENV{'CONTENT_TYPE'} =~ /multipart\/form-data; boundary=(.+)$/ ) {
if ($ENV{'REQUEST_METHOD'} eq "GET") { $input = $ENV{'QUERY_STRING'}; }
elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
$len = 0; $input = '';
while( $len != $ENV{'CONTENT_LENGTH'} ) {
$buf = '';
$len += sysread(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
$input .= $buf;
}
}
my $boundary = '--'.$1;
my @list = split(/$boundary/, $input);
# For some reason there are always 2 extra, that are empty
my $size = @list -2 ;
for $x (1 .. $size) {
$header_body = $list[$x];
$header_body =~ /\r\n\r\n|\n\n/;
# Here we split the header and body
$header = $`;
my $body = $';
$body =~ s/\r\n$//;
# Now we try to get the file name
my $name = $header;
my $blah;
$name =~ /name=\"(.+)"/;
($name,$blah) = split(/"/,$1);
$ATTACH{'NAME'} = $name;
$ATTACH{'FILE_CONTENT'} = $body;
# If the form name is not attach, then we need to parse this like
# regular form data
if ($name ne "attach") {
$body =~ tr/+/ /;
$body =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$body =~ s/<!--(.|\n)*-->//g;
$body =~ s/\n/<br>/g;
$body =~ s/\r//g;
$ATTACH{$name} = $body;
# Otherwise it is an attachment and we need to finish it up
}
else {
$header =~ /filename=\"(.+)\"/;
$ATTACH{'FILE_NAME'} = $1;
$ATTACH{'FILE_NAME'} =~ s/\"//g;
$ATTACH{'FILE_NAME'} =~ s/\s//g;
for $i ($x .. $list[$i]) {
$list[$i] =~ s/^.+name=$//;
$list[$i] =~ /\"(\w+)\"/;
$ATTACH{$1} = $';
}
}
}
return %ATTACH;
}
else {
return &parse_form();
}
}
Please Help..
------------------
- YellowKard -
[This message has been edited by YellowKard (edited May 07, 2000).]
The only problem is that I get an error saying
Code:
# Database Definition: LINKS # --------------------------------------------------------
# Definition of your database file.
%db_def = (
ID => [0, 'numer', 5, 8, 1, '', ''],
Title => [1, 'alpha', 40, 75, 1, '', ''],
URL => [2, 'alpha', 40, 75, 0, '', '^http|news|mailto|ftp'],
Date => [3, 'date', 15, 15, 1, \&get_date, ''],
Category => [4, 'alpha', 0, 150, 1, '', ''],
Description => [5, 'alpha', '40x3', 500, 0, '', ''],
'Contact Name' => [6, 'alpha', 40, 75, 1, '', ''],
'Contact Email' => [7, 'alpha', 40, 75, 1, '', '.+@.+\..+'],
Hits => [8, 'numer', 10, 10, 1, '0', '\d+'],
isNew => [9, 'alpha', 0, 5, 0, 'No', ''],
isPopular => [10, 'alpha', 0, 5, 0, 'No', ''],
Rating => [11, 'numer', 10, 10, 1, 0, '^[\d\.]+$'],
Votes => [12, 'numer', 10, 10, 1, 0, '^\d+$'],
ReceiveMail => [13, 'alpha', 10, 10, 1, 'Yes', 'No|Yes']
);
Code:
# # Uploaded File Settings
# --------------------------------------------------------
# PATH and URL to directory where Attached Files will be stored.
# (make sure you create this directory on your server) No Trailing slash.
$build_attach_path = "$build_root_path/Attach";
$build_attach_url = "$build_root_url/Attach";
# Name of the field in your links.db where the URL of the uploaded
# file will be stored
$attach_file_field = "URL";
# Do you want this to be a required field? 1=Yes 0=No
$attach_field_required = 0;
# Maximum size for file attachments (in KB)
$attach_file_size = "2000";
# List of allowable file extensions. If the file does not have one of the extensions
# listed, it will not be saved to the server. The format for the setting is
# \.extension$
# If you want to allow more than one extension, separate the options by
# a | character. On a UNIX server, these are case sensitive.
$attach_ext = '\.zip$|\.ZIP$';
Code:
#!/usr/bin/perl # -------------
# Links
# -------------
# Links Manager
#
# File: add.cgi
# Description: Adds a record marked unvalidated to the database and
# optionally emails someone.
# Author: Alex Krohn
# Email: alex@gossamer-threads.com
# Web: http://www.gossamer-threads.com/
# Version: 2.0
#
# (c) 1998 Gossamer Threads Inc.
#
# This script is not freeware! Please read the README for full details
# on registration and terms of use.
# =====================================================================
#
# Setup Notes:
# Make sure the require statement below points to the config file.
# Required Librariers
# --------------------------------------------------------
eval {
($0 =~ m,(.*)/[^/]+,) && unshift (@INC, "$1"); # Get the script location: UNIX /
($0 =~ m,(.*)\\[^\\]+,) && unshift (@INC, "$1"); # Get the script location: Windows \
require "admin/links.cfg"; # Change this to full path to links.cfg if you have problems.
require "$db_lib_path/db_utils.pl";
require "$db_lib_path/links.def";
$build_use_templates ?
require "$db_lib_path/site_html_templates.pl" :
require "$db_lib_path/site_html.pl";
};
if ($@) {
print "Content-type: text/plain\n\n";
print "Error including libraries: $@\n";
print "Make sure they exist, permissions are set properly, and paths are set correctly.";
exit;
}
# ========================================================
eval { &main; }; # Trap any fatal errors so the program hopefully
if ($@) { &cgierr("fatal error: $@"); } # never produces that nasty 500 server error page.
exit; # There are only two exit calls in the script, here and in in &cgierr.
sub main {
# --------------------------------------------------------
local (%in) = &get_file_and_form();
# We are processing the form.
if (keys %in != 0) {
&process_form;
}
# Otherwise we are displaying the form (in site_html.pl).
else {
if ($db_single_category) {
my %is_valid = map { $_ => 1 } &category_list;
$ENV{'HTTP_REFERER'} =~ s,/[^/]+\.[^/]+$,,;
$ENV{'HTTP_REFERER'} =~ m,$build_root_url/(.+?)/?$,;
$is_valid{$1} ? &site_html_add_form ($1) : &site_html_add_form ();
}
else {
&site_html_add_form ();
}
}
}
sub process_form {
# --------------------------------------------------------
my ($key, $status, $line, $output);
# Check the referer.
if (@db_referers and $ENV{'HTTP_REFERER'}) {
$found = 0;
foreach (@db_referers) {
$ENV{'HTTP_REFERER'} =~ /$_/i and $found++ and last;
}
if (!$found) {
&site_html_add_failure ("Auto submission is not allowed in this directory. Please visit the site to add your entry.");
return;
}
}
# This will set system fields like Validated to their proper values.
foreach $key (keys %add_system_fields) {
$in{$key} = $add_system_fields{$key};
}
# Set date variable to today's date.
$in{$db_cols[$db_modified]} = &get_date;
open (ID, "<$db_links_id_file_name") or &cgierr("error in process_form. unable to open id file: $db_links_id_file_name. Reason: $!");
$in{$db_key} = <ID> + 1; # Get next ID number
close ID;
# Validate the form input..
$status = &validate_record(%in);
if ($status eq "ok") {
if ($attach_field_required) {
if (!$in{$attach_file_field}) {
if (!$in{'FILE_CONTENT'}) {
&site_html_add_failure ("You must either attach a file or enter data in the $attach_file_field field.");
return;
}
}
}
# Save any attachments
if ($in{'FILE_CONTENT'}) {
if ($in{$attach_file_field}) {
&site_html_add_failure("Please do not enter both a URL and a file. If you choose to upload a file, a URL will be automatically attached.");
return;
}
if (length($in{'FILE_CONTENT'}) > ($attach_file_size * 1000)) {
&site_html_add_failure("Maximum attachment size is $attach_file_size KB. Please reduce the size of your file or email it as an attachment to $db_admin_email.");
return;
}
my $filename = $in{'FILE_NAME'};
($filename =~ m,[/\\]([^/\\]+)$,) and ($filename = $1);
if ($filename !~ /^[\w\d\.\/\\]+$/) {
&site_html_add_failure ("Invalid characters in filename '$filename'. Please use letters, numbers and dashes only.");
return;
}
if ($filename =~ /\.\./) {
&site_html_add_failure ("Invalid characters in filename '$filename'. Please use letters, numbers and dashes only.");
return;
}
if ($filename !~ /$attach_ext/) {
$attach_ext =~ s/\\//g;
$attach_ext =~ s/\$//g;
@ext = split (/\Q|\E/o,$attach_ext);
$attach_ext = join(" or ",@ext);
&site_html_add_failure ("Only files with the following extension(s) are allowed: $attach_ext");
return;
}
open (FILE, ">$build_attach_path/$in{$db_key}-$filename") or &cgierr ("Can't save attach: $build_attach_path/$in{$db_key}-$filename. Reason: $!");
print FILE $in{'FILE_CONTENT'};
close FILE;
$in{$attach_file_field} = "$build_attach_url/$in{$db_key}-$filename";
}
# Update the counter.
open (ID, ">$db_links_id_file_name") or &cgierr("error in get_defaults. unable to open id file: $db_links_id_file_name. Reason: $!");
flock(ID, 2) unless (!$db_use_flock);
print ID $in{$db_key}; # update counter.
close ID; # automatically removes file lock
# Print out the validate input to a "validation database" where it is stored until
# the admin decides to add it into the real database.
open (VAL, ">>$db_valid_name") or &cgierr("error in add_record. unable to open validate file: $db_valid_name. Reason: $!");
flock(VAL, 2) unless (!$db_use_flock);
print VAL &join_encode(%in);
close VAL; # automatically removes file lock
# Send the admin an email message notifying of new addition.
&send_email;
# Send the visitor to the success page.
&site_html_add_success;
}
else {
&site_html_add_failure($status);
}
}
sub send_email {
# --------------------------------------------------------
# Sends an email to the admin, letting him know that there is
# a new link waiting to be validated. No error checking as we don't
# want users to see the informative &cgierr output.
# Check to make sure that there is an admin email address defined.
$db_admin_email or &cgierr("Admin Email Address Not Defined in config file!");
my $to = $db_admin_email;
my $from = $in{$db_cols[$db_contact_email]};
my $subject = "Addition to Database: $in{'Title'}\n";
my $msg = qq|
The following link is awaiting validation:
Title: $in{'Title'}
URL: $in{'URL'}
Category: $in{'Category'}
Description: $in{'Description'}
Contact Name: $in{'Contact Name'}
Contact Email: $in{'Contact Email'}
Remote Host: $ENV{'REMOTE_HOST'}
Referer: $ENV{'HTTP_REFERER'}
To validate, please go to:
$db_script_url
Sincerely,
Links Manager.
|;
# Then mail it away!
require "$db_lib_path/Mailer.pm";
my $mailer = new Mailer ( { smtp => $db_smtp_server,
sendmail => $db_mail_path,
from => $from,
subject => $subject,
to => $to,
msg => $msg,
log => $db_mailer_log
} ) or return;
$mailer->send or return;
}
sub get_file_and_form {
# --------------------------------------------------------
# Code taken from WWWThreads 3.2 based off of work by Steve Hsueh
# and Rick Baker.
#
my ($i, $loc, $key, $val, $input, %ATTACH, $f,$header, $header_body, $len, $buf);
if( $ENV{'CONTENT_TYPE'} =~ /multipart\/form-data; boundary=(.+)$/ ) {
if ($ENV{'REQUEST_METHOD'} eq "GET") { $input = $ENV{'QUERY_STRING'}; }
elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
$len = 0; $input = '';
while( $len != $ENV{'CONTENT_LENGTH'} ) {
$buf = '';
$len += sysread(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
$input .= $buf;
}
}
my $boundary = '--'.$1;
my @list = split(/$boundary/, $input);
# For some reason there are always 2 extra, that are empty
my $size = @list -2 ;
for $x (1 .. $size) {
$header_body = $list[$x];
$header_body =~ /\r\n\r\n|\n\n/;
# Here we split the header and body
$header = $`;
my $body = $';
$body =~ s/\r\n$//;
# Now we try to get the file name
my $name = $header;
my $blah;
$name =~ /name=\"(.+)"/;
($name,$blah) = split(/"/,$1);
$ATTACH{'NAME'} = $name;
$ATTACH{'FILE_CONTENT'} = $body;
# If the form name is not attach, then we need to parse this like
# regular form data
if ($name ne "attach") {
$body =~ tr/+/ /;
$body =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$body =~ s/<!--(.|\n)*-->//g;
$body =~ s/\n/<br>/g;
$body =~ s/\r//g;
$ATTACH{$name} = $body;
# Otherwise it is an attachment and we need to finish it up
}
else {
$header =~ /filename=\"(.+)\"/;
$ATTACH{'FILE_NAME'} = $1;
$ATTACH{'FILE_NAME'} =~ s/\"//g;
$ATTACH{'FILE_NAME'} =~ s/\s//g;
for $i ($x .. $list[$i]) {
$list[$i] =~ s/^.+name=$//;
$list[$i] =~ /\"(\w+)\"/;
$ATTACH{$1} = $';
}
}
}
return %ATTACH;
}
else {
return &parse_form();
}
}
Please Help..
------------------
- YellowKard -
[This message has been edited by YellowKard (edited May 07, 2000).]