2017-01-09 18 views
1

ファイルのアップロードを既存のWebページに追加しようとしています。Webページのファイルのアップロードは常に破損しています

アップロードするたびに、ファイルが破損することがあります。

ファイルハンドルにbinmodeを設定しました。また、のエンコードタイプ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'という名前のサブルーチンや定数がありますか?あなたの 'f($ article {upload_file_name} ne"または$ article {upload_file_name} ne null) 'はあなたが' '厳密に' 'を使わない限り構文エラーでなければなりません。 Perlには 'null'はありません。あなたは 'undef'を望みますが、' undef'を 'ne'でチェックすることはできません。実際、 '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関数と同じことをする2番目の意味を持ちます。また、Perlの解析ルールでは、<$hash{key}>は常にglobと扱われます。

perldoc -f perlopは説明する:角括弧の中に何があるか、どちらもファイルハンドルもファイルハンドル名、型グロブ、または型グロブリファレンスを含む単純スカラ変数、それはファイル名のパターンとして解釈されていないされている場合は

グロビングされなければ、コンテキストに応じて、ファイル名のリストまたはリスト内の次のファイル名のいずれかが返されます。この区別は構文的根拠だけで決定される。つまり、< $ x >は間接ハンドルのreadline()ですが、< $ hash {key} >は常にglob()です。 $ xは単純なスカラ変数ですが、$ hash {key}はそうではありません。これはハッシュ要素です。 < $ x >(余分なスペースに注意してください)は、readline($ x)ではなくglob( "$ x")として扱われます。

  1. 使用明示的なreadlineコール:単純なスカラー

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

while (readline($article{upload_file})) 
  • 割り当てファイルハンドル

  • は、回避策の少なくともいくつかあり

    +0

    ありがとうございました、まさにその通りです。私は奇妙なバグに遭遇したので、ハッシュで何かを疑い始めました。 'my%hash(action => $ cgi-> param( 'action'));'は ""ではなく "Action"を返していました。しかし、私がこのように私のハッシュを設定すると... 'my%hash; $ hash {action} = $ cgi-> param( 'action'); '私は期待した結果を得ました。私たちが話題に入っている間、これはあなたが指摘したグローバルシナリオに関連していますか? – gregnnylf94

    +0

    @ gflynn94:Stack Overflowをフォーラムとして扱ってはいけません。 * Wikipedia *によく似た質問と回答の要約です。あなたが世界の他の国々にとって役に立つかもしれないと想像した場合にのみ、ここに言葉を追加してください。あなたの提出物は、あたかも恒久的な公的文書であるかのように書くべきです。 – Borodin

    +0

    @ mob:Perl v5.14以降、IO :: Fileがオンデマンドで読み込まれているので、 '$ article {upload_file} - > readline'に行きます。 – Borodin

    関連する問題