用C/C++写上传文件的CGI,遇到问题,答对即送5000分

ysh 2002-06-17 11:21:10
工作需要必须用C/C++写一个通过IE浏览器上传文件的CGI。页面端这样写:
<form enctype="multipart/form-data" action="/cgi-bin/loadfile.exe" method="post">
<input type="file" Name="FileName" size="40">
...(省略其它代码)
CGI程序那边,先用getenv("CONTENT_LENGTH")取到上传数据的长度,然后malloc一个buf,接着用一个wile循环调fread从stdin中读数据,但无论如何都读不够getenv("CONTENT_LENGTH")返回的长度。我在IIS和IBM HTTP SERVER(用的是Apache的核心)上都试过,都不行。哪位高人帮忙解决这个问题,5000分马上相赠!
...全文
164 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
welkin_qiu 2002-06-17
  • 打赏
  • 举报
回复
pi1ot(pilot) 的说法错误, CONTENT_LENGTH 对任何以post上传的方法都是有效的, 包括上传文件, 这个我已经用在好多大网站好多年了,没出现过有问题.

大白菜, 你再试试给我100分好了, 唉, 白开心一场,
曾经有5000大元摆在我的面前, 可我就是得不到他....
welkin_qiu 2002-06-17
  • 打赏
  • 举报
回复
pi1ot(pilot) 的说法错误, 对上传文件 CONTENT_LENGTH 都是有效的, CONTENT_LENGTH 里包含的是所有上传数据的长度, 你要从中自行解析出对应各字段的内容, 包括上传文件字段.

此方法我已用在好多大网站都适用, 没有出现过BUG,

大白菜, 没办法看来只能收你100分了, 你再试试吧, 刚才那20 分我没收到

pi1ot 2002-06-17
  • 打赏
  • 举报
回复
unsetf()是标准c++ ios_base函数,cin继承自ios.

void unsetf(fmtflags mask);
Clears mask in flags().

flags:

ios_base& boolalpha (ios_base&);
ios_base& noboolalpha (ios_base&);
ios_base& showbase (ios_base&);
ios_base& noshowbase (ios_base&);
ios_base& showpoint (ios_base&);
ios_base& noshowpoint (ios_base&);
ios_base& showpos (ios_base&);
ios_base& noshowpos (ios_base&);
ios_base& skipws (ios_base&);
ios_base& noskipws (ios_base&);
ios_base& uppercase (ios_base&);
ios_base& nouppercase (ios_base&);
ios_base& internal (ios_base&);
ios_base& left (ios_base&);
ios_base& right (ios_base&);
ios_base& dec (ios_base&);
ios_base& hex (ios_base&);
ios_base& oct (ios_base&);
ios_base& fixed (ios_base&);
ios_base& scientific (ios_base&);
ios_base& unitbuf (ios_base&);
ios_base& nounitbuf (ios_base&);
ysh 2002-06-17
  • 打赏
  • 举报
回复
CSDN有问题,我明明在结帖时给了:welkin_qiu(welkin) 20分,但为什么显示得分是0呢?
ysh 2002-06-17
  • 打赏
  • 举报
回复
pi1ot(pilot) 的观点也很好,但能不能再详细一点,我怎么找不到cin对应的unsetf方法?
另, welkin_qiu(welkin) ,我试图通过“可用分转移”付给你5000分,但我不是中级以上会员,不可转移分数。很感谢你的帮助,如果你有其他方法,我这5000分一定相赠!
pi1ot 2002-06-17
  • 打赏
  • 举报
回复
CONTENT_LENGTH只对application/x-www-form-urlencoded类型数据起作用,如果要读上传的文件数据应该是

string buf;
cin.unsetf( ios::skipws );
while ( cin )
{
cin >> c;
buf += c;
}
ysh 2002-06-17
  • 打赏
  • 举报
回复
好,谢谢,再问一个问题,CSDN一个问题最多只能给100分,我怎么把我的5000分给你呢?
这个问题5 100分已经给你了
welkin_qiu 2002-06-17
  • 打赏
  • 举报
回复
那是因为你没有把文件读模式改为二进制读, 这可是我摸索了好多天的成果, 现在吐血相告, 如果不给分, 哼哼! 记住啊...

-----------------------------------------
C++ 用法

// 设置读模式为二进制
_setmode(_fileno(stdin), _O_BINARY);

// 从标准输入读入数据
std::cin.read(buf, len);

// 恢复标准控制台读数据模式为文本模式
_setmode(_fileno(stdin), _O_TEXT);

C 的用法类似
pi1ot 2002-06-17
  • 打赏
  • 举报
回复
恩?你指的是什么?
welkin_qiu 2002-06-17
  • 打赏
  • 举报
回复
pi1ot(pilot), 你说的那个方法, 如果在上传数据中不仅仅含有文件字段, 还有其他字段的时候就不好办了
ysh 2002-06-17
  • 打赏
  • 举报
回复
再次对welkin_qiu表示感谢!
ysh 2002-06-17
  • 打赏
  • 举报
回复
同时对 pi1ot表示感谢,我真想也给你分点分,你的回答对我也很有帮助,可惜一开始把牛皮吹大了,又只有可怜的20分,只好给welkin_qiu了
pi1ot 2002-06-17
  • 打赏
  • 举报
回复
/*******************************************************
设分隔符为{boundary},回车(0x0D)和换行符(0x0A)为<CR>

multipart/form-data, boundary={boundary}

1.文件型参数的multipart格式:
--{boundary}<CR>
Content-Disposition: form-data; name="参数名称"; filename="文件名称"<CR>
Content-Type: {Content-Type}<CR>
<CR>
文件内容
<CR>
--{boundary}<CR>

2.普通参数的multipart格式:
--{boundary}<CR>
Content-Disposition: form-data; name="参数名称"<CR>
<CR>
参数值
<CR>
--{boundary}<CR>
*******************************************************/

呵呵,不要你的分,没有抢分的意思.
ysh 2002-06-17
  • 打赏
  • 举报
回复
实在太对不起welkin_qiu(welkin) ,这样吧,我另外再提一个问题,welkin_qiu(welkin) ,只要你去答,不管对不对,都把那100分给你,请看我的下一个问题:“如何有效地把上传的文件数据与其它一起上传的变量分离出来”。
pi1ot 2002-06-17
  • 打赏
  • 举报
回复
哦?
那就是解决方法不同了,multipart/form-data 数据我不看CONTENT_LENGTH 的,就是while(cin),从目前的应用看也没问题。

2,203

社区成员

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

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