2017-01-09 22 views
1

我想将文件上传添加到现有的网页上。网页文件上传总是被损坏

每当我上传我得到一个损坏的文件。

我确保在文件句柄上设置binmode。我也有我的输入enxtype设置为multipart/formdata在我的形式。

我的代码如下

$article{upload_file_name} = $cgi->param('upFile'); 
$article{upload_file}  = $cgi->upload('upFile'); 

if ($article{upload_file_name} ne "" or $article{upload_file_name} ne null) { 

    open(UPLOADS, ">$uploads_dir/$article{upload_file_name}") 
      or die "Could not open $uploads_dir/$article{upload_file_name}"; 

    binmode UPLOADS; 

    while (<$article{upload_file}>) { 
     print UPLOADS; 
    } 

    close UPLOADS; 
} 

我也试过这个

$article{upload_file} = $cgi->param('upFile'); 

if ($article{upload_file} ne "" or $article{upload_file} ne null) { 

    open(UPLOADS, ">$uploads_dir/$article{upload_file}") 
      or die "Could not open $uploads_dir/$article{upload_file}"; 
    binmode UPLOADS; 

    while (<$article{upload_file}>) { 
     print UPLOADS; 
    } 

    close UPLOADS; 
} 
+1

首先,您需要在脚本的顶部添加'use strict;'和'use warnings'all';';在Perl中没有'null',所以'$ article {upload_file_name} ne null'检查文件名是否等于文本文本“null”。 – ThisSuitIsBlackNot

+1

你是否有一个子程序或常量名称为'null'定义的地方?除非您不使用strict,否则您的文本行应该是语法错误。 Perl中没有'null'。你想'undef',但是你不能用'ne'来检查'undef'。事实上,执行if($ article {upload_file_name}){...}就足够了,因为只要有非空或者undef的值,这个值就是真的。 – simbabque

+0

参见[undef](http://p3rl.org/undef)和[defined](http://p3rl.org/defined)。 – choroba

回答

1
<$article{upload_file}> 

没有做什么你觉得它在做什么。钻石运算符(<>)用于代替Perl的readline函数,但它具有与Perl的glob函数完全相同的功能。在Perl的解析规则中,<$hash{key}>总是被视为glob

perldoc -f perlop说明:

如果角度括号内什么是既不是文件句柄,也不含有一个文件句柄名,类型团,或类型团参考简单的标量变量,它被解释为一个文件名模式被晶片被保护,并根据上下文返回列表中的文件名列表或下一个文件名。这种区别仅在句法理由上确定。这意味着< $ x >始终是来自间接句柄的readline(),但< $ hash {key} >始终是glob()。这是因为$ x是一个简单的标量变量,但$ hash {key}不是 - 它是一个散列元素。即使< $ x >(注意额外的空间)被视为glob(“$ x”),而不是readline($ x)。

至少有一对夫妇的解决方法:

  1. 使用显式调用readline

    while (readline($article{upload_file})) 
    
  2. 分配文件句柄简单的标量

    my $upload_fh = $article{upload_file}; 
    ... 
    while (<$upload_fh>) 
    
+0

谢谢,这正是它的原因。当我遇到一个奇怪的错误时,我开始怀疑与哈希有关的东西。 'my%hash(action => $ cgi-> param('action'));'正在返回“Action”而不是“”。但是,当我设置我的哈希像这样...'我%哈希; $ hash {action} = $ cgi-> param('action');'我得到了我的预期结果。就在我们讨论这个话题时,这与你指出的glob情景有关? – gregnnylf94

+0

@ gflynn94:请不要将Stack Overflow视为论坛。这是一个问题和答案的汇编,更像*维基百科*。只有在你认为自己可能对世界其他地方有用的情况下,你才应该在这里添加词语,并且你应该把你的提交作为永久性公共文件来写。 – Borodin

+0

@mob:我会去'$ article {upload_file} - > readline',因为'IO :: File'自从Perl v5.14开始按需加载。 – Borodin