免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3669 | 回复: 8
打印 上一主题 下一主题

使用binmode后文件上传还是变形? 高手指点. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-24 18:26 |只看该作者 |倒序浏览
使用binmode后文件上传还是变形? 高手指点.

环境:liunx ,用PERL写的上传文件cgi代码如下:
my ($tmpfilename) = $upfile =~ m|([^/:\\]+)$|;
my ($buffer);
open (FILE,">$basedir/$tmpfilename";
binmode(FILE);
while (read($upfile,my $buffer,204) {
      print FILE $buffer;
      }
close (FILE);

问题是: 可以上传文件,超过10K的上传不了,更严重的问题是文件没法用,原文件5K上传后变成8K.

已经启用了binmode(FILE);二进制传输,怎么还会出错? 高手指点一下,谢谢~

论坛徽章:
0
2 [报告]
发表于 2007-03-24 18:43 |只看该作者
先把你的代码放到code里

论坛徽章:
0
3 [报告]
发表于 2007-03-24 19:17 |只看该作者

使用binmode后文件上传还是变形? 高手指点.

sorry.没注意代码显示这个问题


环境:liunx ,用PERL写的上传文件cgi代码如下:


  1. my ($tmpfilename) = $upfile =~ m|([^/:\\]+)$|;
  2. my ($buffer);
  3. open (FILE,">$basedir/$tmpfilename");
  4. binmode(FILE);
  5. while (read($upfile,my $buffer,2048)) {
  6.    print FILE $buffer;
  7.    }
  8. close (FILE);
复制代码


问题是: 可以上传文件,超过10K的上传不了,更严重的问题是文件没法用,原文件5K上传后变成8K. 已经启用了binmode(FILE);二进制传输,怎么还会出错? 高手指点一下,谢谢~

论坛徽章:
0
4 [报告]
发表于 2007-03-24 19:42 |只看该作者
1. 超过10K上传不了,去检查一下$CGI::POST_MAX 的值以及Web服务器是否有相应的上限设置。

2. $upfile是什么?把相关的定义也贴出来。估计你的问题是由于没有对数据源binmode。

3. 一个小问题,两处的my $buffer,虽然不算错误,但似乎没必要。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-03-24 20:58 |只看该作者
> 原文件5K上传后变成8K
你把那 5k 和那 8k 观察一下,有什么变化?
xxd 或者 od 命令就可以看。如果自己不懂如何看,就发上来让大家看看。

论坛徽章:
0
6 [报告]
发表于 2007-03-24 23:12 |只看该作者

贴出所有测试代码

就1个文件(upfile1.cgi), 表单提交本文件
问题:
加了$CGI:OST_MAX参数还是一样的问题,3K以下文件上传后正常可以使用,3K到10K文件上传后没法用,超过10K的上传不了(界面无响应)。已经启用了binmode(FILE);二进制传输,怎么还会出错? 高手指点一下,再次感谢~

所有测试代码如下:



  1. #!/usr/bin/perl

  2. ## 定义初始参数 ##
  3. use CGI;
  4. $CGI::DISABLE_UPLOADS = 0;
  5. $CGI::POST_MAX = 1024 * 1024 ;
  6. my $maxsize = 1024;
  7. my $basedir="/test";

  8. my $query=CGI->new();
  9. my $action=$query->param('action');
  10. my $upfile=$query->upload('upfile');

  11. my %Mode = (
  12.   'propage1'  => \&propage1,
  13.   'propage2'  => \&propage2,
  14.    );

  15. if ($Mode{$action}) {
  16. $Mode{$action}->();
  17. } else {
  18. &propage1;
  19. }

  20. ## 显示界面1 ##
  21. sub propage1 {
  22. my $showit = qq~
  23. <form action=upfile1.cgi method=post enctype='multipart/form-data'>
  24. <input type=hidden name='action' value='propage2'>
  25. 请选择上传文件:<input type=file size=26 name='upfile'><br><br>
  26. <input type=submit class=btn value=\"  立即上传  \"></form>~;
  27. print $showit;
  28. }

  29. ## 显示界面2(处理文件上传) ##
  30. sub propage2 {
  31. my $upfile=$query->upload('upfile');
  32. my $size = (stat($upfile))[7];
  33. &error("<br>文件大小不能超过 1M !") if ($size > $maxsize * 1024);
  34. my $showit;

  35. if ($upfile) {
  36. my ($tmpfilename) = $upfile =~ m|([^/:\\]+)$|;
  37. my ($buffer);
  38. open (FILE,">$basedir/$tmpfilename");
  39. binmode($upfile);
  40. binmode(FILE);
  41. while (read($upfile,my $buffer,2048)) {
  42.       print FILE $buffer;
  43.       }
  44. close (FILE);
  45. close ($upfile);

  46. $showit = qq~<br>上传文件成功!~;
  47. }else {
  48. $showit = qq~<br>没有选择配置文件!~;
  49. }
  50. print $showit;
  51. }

复制代码

论坛徽章:
0
7 [报告]
发表于 2007-03-26 09:59 |只看该作者
up

论坛徽章:
0
8 [报告]
发表于 2007-03-26 10:26 |只看该作者
原帖由 jayson999 于 2007-3-24 23:12 发表
就1个文件(upfile1.cgi), 表单提交本文件
问题:
加了$CGI:OST_MAX参数还是一样的问题,3K以下文件上传后正常可以使用,3K到10K文件上传后没法用,超过10K的上传不了(界面无响应)。已经启用了binmode(FILE); ...


经过测试,你的代码可以用。
有一点,你的sub propage1根本就没有打出header,所以要加上。
这种示例代码网上太多了吧,随便搞一个就行,你的代码可真ugly.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2007-03-26 10:30 |只看该作者
原帖由 jayson999 于 2007-3-24 23:12 发表
3K以下文件上传后正常可以使用,3K到10K文件上传后没法用,超过10K的上传不了(界面无响应)。已经启用了binmode(FILE); ...

我在前面的回复没看到?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP