Zend_File_Transfer с несколькими файлами не загружается одинаково - PullRequest
3 голосов
/ 19 мая 2011

Странный заголовок, да, но проблема проста; просто усугубляет. У меня есть форма, которую я создал без использования Zend_Form, и она имеет две загрузки файлов:

<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 () сегментированы так, чтобы влиять только на их соответствующие файлы, в данном случае «изображение» или «файл» - имена полей формы.

Загрузка "файла" всегда работает! Однако загрузка изображения не происходит, и, более того, она помещает временный файл в каталог RESOURCES_FILES, что не имеет никакого смысла. Так что в этом каталоге есть PDF-файлы и все, что угодно, кроме таких файлов, как php8TJT13, phpXmOzQM и т. Д.

Я смотрел на этот код и искал через переполнение стека и все, что Google появится, и я не могу найти никого, кто имеет эту проблему. Помогите!

1 Ответ

4 голосов
/ 20 мая 2011

Хорошо, так что я больше копался, и оказалось, что может быть проблема с тем, как я цепочил 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, возможно, вы можете прокомментировать мое решение или исправить ошибку, которая вызывает проблему.Возможно, есть более «зендский» способ сделать это, но он работает сейчас, и это чертовски хорошо.

Ссылки

Почему я думал, что это была цепочка метода addFilter(),см. примечание в Примере № 3 (ниже):

Примечание. Обратите внимание: несмотря на то, что установка одного и того же фильтра допускается несколько раз, это может привести к проблемам при использовании разных параметров для одного и того же фильтра.

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

Случайная статья в блоге, которая вдохновила меня на попытку изолировать каждого из них, я называю это «загрузка директивы», хотя я не уверен, что это такПозвонил:

http://www.pc -freak.net / blog / tag / upload-несколько-файлов-из-формы-с-zend-framework-zf-storing-uploaded-zf-files-с-уникальное имя /

...