3

奇妙なタイトルですが、問題は単純です。単に集約します。Zend_Formを使用せずに作成したフォームがあり、2つのファイルアップロードがあります。

<input name="image" type="file" />
<input name="file" type="file" />

これが、アップロードを処理しているコントローラーからのコードのチャンクです。実際にはもう少しありますが、これは関連する部分です:

$data['image'] = (isset($_FILES["image"]) && $_FILES["image"]["name"] ? $_FILES["image"]["name"] : NULL);
$data['file'] = (isset($_FILES["file"]) && $_FILES["file"]["name"] ? $_FILES["file"]["name"] : NULL);

$options = array('ignoreNoFile' => TRUE);
$upload = new Zend_File_Transfer();

$upload->setOptions($options)
       ->addFilter('Rename', array('target' => RESOURCES_IMG . $data['image'], 'overwrite' => TRUE), 'image')
       ->addFilter('Rename', array('target' => RESOURCES_FILES . $data['file'], 'overwrite' => TRUE), 'file')
       ->addValidator('ImageSize', false, array('minwidth'  => 100,
                                                'maxwidth'  => 100,
                                                'minheight' => 100,
                                                'maxheight' => 100), 'image')
       ->addValidator('Extension', false, 'jpg', 'image');

if (!$upload->isValid())
{
 echo '<h1>Oops</h1><p>Please correct the following errors: <hr /></p>';

 foreach ($upload->getMessages() as $key => $val)
 {
  echo '<p><strong>' . $key . '</strong><br />' . $val . '</p>';
 }
 die;
}
else
{
 $upload->receive();
} // if (!$upload->isValid())

それはかなり簡単です。$ dataのものは、ファイル名が存在する場合はそれを取得するか、変数をNULLに設定するだけです。addFilter()とaddValidator()をセグメント化して、関連するファイル(この場合は「image」または「file」(フォームフィールドの名前)のみに影響を与える)を使用しています。

「ファイル」のアップロードは常に機能します。ただし、「画像」のアップロードは行われず、さらに一時ファイルがRESOURCES_FILESディレクトリに配置されます。これはまったく意味がありません。そのため、そのディレクトリには、php8TJT13、phpXmOzQMなどのファイルに加えてPDFなどが含まれます。

私はこのコードをじっと見つめ、Stack Overflowを検索していて、Googleが表示するものは何でも検索しましたが、この問題を抱えている人は見つかりませんでした。ヘルプ!

4

1 に答える 1

4

了解しました。さらに掘り下げましたが、チェーンの方法に問題がある可能性があることが判明したaddFilter()ため、各ファイルを分離してアップロードを個別に処理することを試みて、別の方向に移動することにしました。これまでのところ、機能しているようです。改訂されたコードは次のとおりです。

$data['image'] = (isset($_FILES["image"]) && $_FILES["image"]["name"] ? $_FILES["image"]["name"] : NULL);
$data['file'] = (isset($_FILES["file"]) && $_FILES["file"]["name"] ? $_FILES["file"]["name"] : NULL);

$upload = new Zend_File_Transfer();

$files = $upload->getFileInfo();

$options = array('ignoreNoFile' => TRUE);
$upload->setOptions($options);

foreach ($files as $field => $contents)
{
 if(!strlen($contents["name"]))
 {
  continue;
 }

 // upload instructions for image
 if ($field == 'image')
 {
  $upload->addFilter('Rename', array('target' => RESOURCES_IMG . $data['image'], 'overwrite' => TRUE), 'image')
         ->addValidator('ImageSize', false, array('minwidth'  => 100,
                                                  'maxwidth'  => 100,
                                                  'minheight' => 100,
                                                  'maxheight' => 100), 'image')
         ->addValidator('Extension', false, 'jpg', 'image');
 }

 // upload instructions for file
 if ($field == 'file')
 {
  $upload->addFilter('Rename', array('target' => RESOURCES_FILES . $data['file'], 'overwrite' => TRUE), 'file');
 }

 if(!$upload->receive($field)) {
  echo '<h1>Oops</h1><p>Please correct the following errors: <hr /></p>';

  foreach ($upload->getMessages() as $key => $val)
  {
   echo '<p><strong>' . $key . '</strong><br />' . $val . '</p>';
  }
  die;
  //return;
 }
} // foreach

疑似説明

を使用してgetFileInfo()、使用可能なファイルの配列を取得し、それぞれをループします。最初のforループの開始時に、このファイルに名前があるかどうかを確認します。名前がない場合は、フィールドが空白のままになっていると想定しNULL、ループにそれをスキップするように指示しますcontinue

ループに入ったら、単純な条件を使用して、アップロードディレクティブを適切なフォームフィールドと照合します。Zendに興味がある場合は、残りの部分はかなり自明です。

うまくいけば、これは私の苦境にあった他の誰かを助けるでしょう。Zendの第一人者であれば、私の解決策についてコメントしたり、問題の原因となっているバグを修正したりできます。それを行うにはもっと「Zend」の方法があるかもしれませんが、それは現在機能していて、それはとても気持ちがいいです。

参考文献

メソッドの連鎖だと思った理由は、addFilter()例3(下記)の注を参照してください。

注:同じフィルターを複数回設定することは許可されていますが、同じフィルターに異なるオプションを使用すると問題が発生する可能性があることに注意してください。

http://framework.zend.com/manual/1.11/en/zend.file.transfer.filters.html

それぞれを分離しようと私にインスピレーションを与えたランダムなブログ記事。私はそれを「アップロードディレクティブ」と呼んでいますが、それが何と呼ばれているのかはわかりません。

http://www.pc-freak.net/blog/tag/uploading-multiple-files-from-a-form-with-zend-framework-zf-storing-uploaded-zf-files-with-unique-name/

于 2011-05-20T03:49:35.610 に答える