上传文件的CGI程序

qfly 2003-07-19 12:57:46
请问哪里有可以让用户上传文件的做好的CGI程序?(我不会做)
文件大小约5~10Mb(我下了一两个CGI程序只能传小文件)。最好还需要用户输入id与密码。

感谢!
...全文
189 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lmovie 2004-01-12
  • 打赏
  • 举报
回复
//=========================================================
// multform.cpp
// multipart/form-data
//=========================================================

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>

#define MAX_MEMORY (1024*1024) //1M bytes.


char* memstr(char* begin, const char* end, const char* key)
{
const size_t keylen = strlen(key);
for (char* ptr=begin; &ptr[keylen-1]<=end; prt++)
{
if (!memcmp(ptr,key,keylen)) return prt;
}
return NULL;
}


int FindTerm(char*& begin, char*& end, char* separator)
{
char* ptr;

if ((ptr = memstr(begin,end, separator)) == NULL) return 0;
begin = &ptr[strlen(separator)+2];

if ((ptr = memstr(begin,end, separator)) == NULL) return 0;
end = &ptr[-3];

return 1;
}


int lsFileTerm(char* begin, char* name, char* fname)
{
return 2 == sscanf(begin,
"Content-Disposition: form-data;"
"name=\"%[^\"]\"; fimename=\"%[^\"]\"", name, fname);
}


int lsNormalTerm(char* begin, char* name)
{
return 1 == sscanf(begin,
"Content-Disposition: form-data; name=\"%[^\"\"",name);
}


void SkipBrankLine(char*& begin, char* end)
{
const char* brank = "\r\n\r\n";
char* ptr;

if ((ptr = memstr(begin, end, brank)) == NULL)
{
printf("Broken data; not found a brank line.\n");
exit(1);
}

begin = &ptr[strlen(brank)];
}


void memtofile(const char* begin, const char* end, const char* fname)
{
int fd;

if ((fd = open(fname, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0600)) < 0)
{
printf("Error in open:%s.\n",strerror(error));
exit(1);
}

int size = size_t(end) - size_t(begin) + 1;
write(fd, begin, size);
close(fd);
}


void memtostr(const char* begin, const char* end, char* str)
{
int size = size_t(end) - size_t(begin) + 1;
strncpy(str, begin, size);
}


int main(void)
{
char name[32], value[1024], fname[64];

puts("Content-type: text/plain\n\n");

u_long msize = atol(getenv("CONTENT_LENGTH"));
if (msize > MAX_MEMORY)
{
printf("Too large data to recieve.\n");
exit(1);
}


char* mbegin = new char [msize];
char* end = new char [msize-1];

fread(mbegin, 1, msize, stdin);

char separator[256];
sscanf(mbegin, "%[^\r]", separator);

char *begin = mbegin, *end = mend;

while (FindTerm(begin, end, separator))
{
if (lsFileTerm(begin, name, fname))
{
SkipBrankLine(begin, end);

memtofile(begin, end, "upload.dat");

printf("Recieved file %s\n", fname);
}
else if (lsNormalTerm(begin, name))
{
SkipBrankLine(begin, end);

memtostr(begin, end, value);

printf("Recieved [%s] = [%s]\n", name, value);
}else{
exit(0);
}

begin = end;
end = mend;
}

delete [] mbegin;

return 0;
}

不知能用否?
qfly 2003-07-24
  • 打赏
  • 举报
回复
实在不好结贴,散了算了,接分者请UP,明天结贴。
flyycyu 2003-07-19
  • 打赏
  • 举报
回复
up
qfly 2003-07-19
  • 打赏
  • 举报
回复
实在难以置信,web版竟如此冷清!
qfly 2003-07-19
  • 打赏
  • 举报
回复
简单些,请问如何在下面的CGI程序中加上一个要求输入用户名,并且按下“上传”后如果用户名不是"1234"时不上传。

实际上就是如何从FORM获得用户名的简单问题,致谢!!


#!/usr/bin/perl

$meurl="http://xxx/cgi-bin/upload.pl";
$basedir='/home/xxx/public_html/upload/';
$windows = 'no'; #'yes' or 'no'
@valid = ('http://xxx);
$dircommand = 'ls -l';

#############################################################################################
#If method=get
#############################################################################################


if($ENV{'REQUEST_METHOD'} =~ /get/i)
{
if($ENV{'QUERY_STRING'} ne "")
{
&get_form_data;
$current = $formdata{'directory'};
}
else
{
$current = $basedir;
$inbase = "yes";
}

print "Content-type: text/html\n\n";
print "<html>\n";
print "<title>上传文件</title>\n";

if($inbase eq "yes")
{
opendir(DIR,"$basedir") || &unable("$basedir");
}
else
{
opendir(DIR,"$formdata{'directory'}") || &unable("$formdata{'directory'}");
}
@dirs=grep(/\w/,readdir(DIR));
close(DIR);

foreach $item (@dirs)
{
if($item =~ /\w/)
{
if(-d "$basedir$item")
{
push(@direct,"$basedir$item\/",$item);
}
}
}
%direct=@direct;
$number=@direct;
print "<center><h2> \n</h2></center>\n";
print "<center><h2>上传文件</h2></center>\n";
#把用户名加到下面这个FORM里


print "<form ENCTYPE=\"multipart/form-data\" method=post action=\"$meurl\">\n";
print "<center>文件名: <input type=file name=\"uploaded_file\">\n";
print "<input type=hidden name=\"directory\" value=\"$current\">\n";
print "<input type=submit value=\"上传文件\">\n";
print "</form></center>\n";
print "\n<center>如果文件较大,请耐心等待!</center>\n";

print "</html>\n";
exit 0;
}

#############################################################################################
#Check if the URL(HTTP REFERER) is valid
#############################################################################################

foreach $referer (@valid)
{
if($ENV{'HTTP_REFERER'} =~ /$referer/)
{
$good_ref="yes";
}
}
if($good_ref ne "yes")
{
print "Content-type: text/html\n\n";
print "<title>Please go away</title>";
print "<body bgcolor=\"\#ffffff\" text=\"\#000000\">";
print "你试图通过地址窗口来直接运行该脚本或 ";
print "使用了一个不合法的表单来提交,两者都是不允许的.";
print "</html>\n";
exit 0;
}

#############################################################################################
#Do the upload stuff.
#############################################################################################

$| = 1;

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
$buffer =~ /^(.+)\r\n/;
$bound = $1;
@parts = split(/$bound/,$buffer);

$filename=$parts[1];
$parts[1] =~ s/\r\nContent\-Disposition.+\r\n//g;
$parts[1] =~ s/Content\-Type.+\r\n//g;
$parts[1] =~ s/^\r\n//;

@subparts = split(/\r\n/,$parts[2]);
$directory = $subparts[3];
$directory =~ s/\r//g;
$directory =~ s/\n//g; #got the directory name

$filename =~ s/Content-Disposition\: form-data\; name=\"uploaded_file\"\; filename\=//g;
@stuff=split(/\r/,$filename);
$filename = $stuff[1];
$filename =~ s/\"//g;
$filename =~ s/\r//g;
$filename =~ s/\n//g;

@a=split(/\\/,$filename);
$totalT = @a;
--$totalT;
$fname=$a[$totalT];

@a=split(/\//,$fname); #then ignore stuff before last forwardslash for Unix machines
$totalT = @a;
--$totalT;
$fname=$a[$totalT];

@a=split(/\:/,$fname); #then ignore stuff before last ":" for Macs?
$totalT = @a;
--$totalT;
$fname=$a[$totalT];

@a=split(/\"/,$fname); #now we've got the real filename
$filename=$a[0];

if($parts[1] !~ /[\w\d]/)
{
print "Content-Type: text/html\n\n";
print "<html>\n<title>Error!</title>\n";
print "<body bgcolor=\"\#ffffff\" text=\"\#000000\">\n";
print "你并没有提供一个文件来上传或者它是空的.\n";
print "</html>\n";
exit 0;
}

open(REAL,">$directory$filename") || &error($!);
binmode REAL;
print REAL $parts[1];
close(REAL);

if($windows ne 'yes') #chmod it for unix systems
{
`chmod 777 $directory$filename`;
}

#############################################################################################
#Let the user know that the upload's complete and give him the relevant information
#############################################################################################

if(-e "$directory$filename")
{
print "Content-Type: text/html\n\n";
print "<html>\n<title>Upload Successful</title>\n";
print "<body bgcolor=\"\#ffffff\" text=\"\#000000\">\n";
print "上传成功! 以下是该文件的数据\:\n";
print "<ul>\n";
print "<li><b>新文件名</b>: $filename\n";
print "<li><b>大小</b>: $ENV{'CONTENT_LENGTH'} bytes\n";
print "</ul><br>";
print "</html>\n";
exit 0;
}
else
{
print "Content-Type: text/html\n\n";
print "<html>\n<title>Upload Unsuccessful</title>\n";
print "<body bgcolor=\"\#ffffff\" text=\"\#000000\">\n";
print "上传失败\.\.\.不能建立 $directory.\n";
print "<br><b>错误信息</b>\n";
print "<pre>$!</pre>\n";
print "</html>\n";
exit 0;
}

#############################################################################################
#Subroutines
#############################################################################################

sub error{

print "Content-Type: text/html\n\n";
print "<html>\n<title>Error!</title>\n";
print "<body bgcolor=\"\#ffffff\" text=\"\#000000\">\n";
print "不能建立 <b>$directory</b>\n";
print "<br><b>错误信息:</b>$_[0]\n";
print "</html>\n";
exit 0;
}

sub get_form_data
{

@pairs=split(/\&/,$ENV{'QUERY_STRING'});
foreach $pair (@pairs)
{
($name,$value) = split(/\=/,$pair);
$name =~ s/\+/ /g;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/~!/ ~!/g;
$value =~ s/\+/ /g;
$value =~ s/\n//g;
$value =~ s/\r/\[ENTER\]/g;
push (@formdata,$name);
push (@formdata,$value);
}
%formdata=@formdata;
return %formdata;
}

sub unable{
print "Content-type: text/html\n\n";
print "<html>\n";
print "<title>Error</title>\n";
print "<body bgcolor=\"\#ffffff\" text=\"\#000000\">\n";
print "不能打开: $_[0]\n";
print "</html>\n";
exit 0;
}
chinesun 2003-07-19
  • 打赏
  • 举报
回复
是这个:http://www.yuzi.net/
chinesun 2003-07-19
  • 打赏
  • 举报
回复
你可以到www.cgi2000.com去下载吧

2,203

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 CGI
社区管理员
  • CGI社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧