免费注册 查看新帖 |

Chinaunix

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

perl 带session下载文件问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-12 18:26 |只看该作者 |倒序浏览
想求助各位大牛,CGI:SESSION登录后,如何利用session来判断某用户能下载文件?文件格式为DOC。

论坛徽章:
0
2 [报告]
发表于 2010-12-12 18:46 |只看该作者
同问,我也不懂。

论坛徽章:
0
3 [报告]
发表于 2010-12-12 21:00 |只看该作者
想求助各位大牛,CGI:SESSION登录后,如何利用session来判断某用户能下载文件?文件格式为DOC。
shiru 发表于 2010-12-12 18:26



    这可不是session的能力,而是你的应用程序里对权限分级的设计。
可以设计不同的访问级别,例如level 1可以下载文件,level 2不能等。
然后将这个level放在session里。

论坛徽章:
0
4 [报告]
发表于 2010-12-14 12:19 |只看该作者
仙子的意思,我明白。对用户进行一个文件访问设定,对于满足条件的放入session中,进行判断。
我目前遇到的问题,可能是我没表达清楚:文件存放的路径会被人知道,如何在session或者其他机制能判断,不让其下载。

论坛徽章:
0
5 [报告]
发表于 2010-12-14 12:48 |只看该作者
仙子的意思,我明白。对用户进行一个文件访问设定,对于满足条件的放入session中,进行判断。
我目前遇到的 ...
shiru 发表于 2010-12-14 12:19



    写一个apache handler,在access阶段做访问控制。
比如直接get http://abc.com/a.doc不行。
但是 get http://abc.com/a.doc?verify=******就可以
verify是一个验证串,由前端程序产生。

论坛徽章:
0
6 [报告]
发表于 2010-12-20 10:04 |只看该作者
本帖最后由 shiru 于 2010-12-20 10:07 编辑

感谢仙子,实现了我需要的功能,现公开我的思路,大家参考还有更好的方法没。
我的目的主要是想实现用户登录后,能依据用户信息,下载不同文档,需要验证用户信息,否则不能下载。

  1. use myModule;

  2. my $q = myModule->cgi();

  3. #####获取Form表单值####
  4. my %FORM = $q->get_params();
  5. my $ss_id = $FORM{ss_id};

  6. # 验证用户登录
  7. my %session = myModule->verify_login($ss_id);
  8. my $d_id = $session{d_id};

  9. my $path = '/var/.../down/';
  10. if ( $d_id  == 1 ) {
  11.         $infilename = 'a.zip';
  12.         $name_zip = '文件一';
  13. } elsif ( $d_id  == 2 ) {
  14.         $infilename = 'b.zip';
  15.         $name_zip = '文件二';
  16. }

  17. $q->print_header_zip($name_zip);

  18. binmode STDOUT;
  19. open(FIN,"$path$infilename") or die ("can not open $infilename\n");
  20. binmode FIN;
  21. while ( read(FIN, my $buffer, 1024) ) {
  22.         print STDOUT $buffer;
  23. }
  24. close(STDOUT);
复制代码
print_header_zip 方法实现打印文件头:

  1. package myModule::CGI;
  2. use warnings;
  3. use strict;
  4. use CGI qw(:standard);
  5. ……

  6. sub print_header_zip {
  7.         my $self = shift;
  8.         my $name = shift;
  9.         my $header = $self->{q}->header(
  10.                 -type        => 'application/zip',
  11.                 -charset => 'gb2312',
  12.                 -attachment => $name.'.zip',
  13.         );
  14.         print $header;
  15.         return;
  16. }

  17. ……

  18. 1;
复制代码
这样就隐藏了具体文件路径,放在apache不能访问的路径上。 文件直接采用文件流输入的方式。

评分

参与人数 1可用积分 +10 收起 理由
兰花仙子 + 10 我很赞同

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2010-12-20 10:20 |只看该作者
感谢分享!

这样就隐藏了具体文件路径,放在apache不能访问的路径上。


描述错误。应该是放在apache的文档目录之外。
apache都不能访问的话,文件如何print out?

还有2个方法:
(1)使用内核的sendfile;
(2)放在apache的文档目录里,由apache执行文件IO,但是加一个钩子函数做验证。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP