загрузка нескольких изображений в Zend Framework, как? - PullRequest
2 голосов
/ 29 марта 2012

У меня проблема с загрузкой нескольких файлов на диск.вот мой код.

У меня есть запрос с 2 фотографиями, который отправляется в функцию загрузки.2 изображения находятся в переменной, называемой $multiUpload

$folderPath = '/var/www/';
if (is_array($multiUpload)){
            $file = array();
            $filename = array();

            foreach($multiUpload as $key=>$val){
                // get the file extension
                $file[] = explode('.',$val);

                // create custom file name
                $filename[] = time().'.'.$file[$key][1];

                //send to the upload function
                $this->uploadToDisk($folderPath, $filename[$key]);

                // sleep 1 sec so that the pic names will be different
                sleep(1);
            }
                 return $filename;

        }


public function uploadToDisk($folderPath, $filename)
{

    $adapter = new Zend_File_Transfer_Adapter_Http();
    $adapter->setDestination($folderPath);
    $adapter->addFilter( 'Rename',array(
            'target' => $folderPath."/".$filename,
            'overwrite' => true
            ) );
    if ($adapter->receive()) {
        $message = "success";
    } else {
        $message = "fail";
    }

    return $message;
}

, которая вернет

Array
(
    [0] => Array
        (
            [0] => 1332977938.jpg
            [1] => 1332977939.jpg
        )

)

, но только array[0][0] or 1332977938.jpg фактически сохранит диск.

Почему они теперь оба спасены?проводной

есть идеи?

1 Ответ

3 голосов
/ 29 марта 2012

Я подозреваю, что второй вызов uploadToDisk возвращает fail, поскольку вы можете вызывать Zend_File_Transfer_Adapter_Http::receive() только один раз для каждого файла. Поскольку вы не указываете файл при вызове receive, он получает все файлы при первом вызове uploadToDisk и впоследствии завершается с ошибкой File Upload Attack.

Вот код, который вы можете попробовать. Он пытается получить каждый файл по отдельности, а затем сохранять их по одному при каждом вызове на uploadToDisk.

Несколько замечаний по поводу кода:

  • Возможно, необходимо изменить первый параметр на uploadToDisk ($ val), так как я не уверен, каковы исходные значения. Он должен соответствовать одному из имен элементов, используемых для загрузки файла (см. Zend_File_Transfer_Adapter_Http::getFileInfo()) для списка файлов.
  • Я изменил метод генерации уникального имени файла, чтобы вам не нужно было sleep(1)
  • Zend_File_Transfer_Adapter_Abstract::setDestination() устарела и исчезнет в будущем. Вместо этого просто используйте фильтр Rename. При использовании Rename, setDestination() не имеет эффекта.

И вот оно ...

<?php

$folderPath = '/var/www/';

if (is_array($multiUpload)){
    $filenames = array();

    foreach($multiUpload as $key => $val){
        // get the file extension
        $ext = explode('.', $val);
        $ext = $ext[sizeof($ext) - 1];

        // create custom file name
        do {
            $filename = uniqid(time()) . '.' . $ext;
            $diskPath = $folderPath . $filename;
        } while (file_exists($diskPath));

        $filenames[$key] = $filename;

        //send to the upload function
        // $val is the file to receive, $diskPath is where it will be moved to
        $this->uploadToDisk($val, $diskPath);
    }

    return $filename;
}


public function uploadToDisk($file, $filename)
{
    // create the transfer adapter
    // note that setDestination is deprecated, instead use the Rename filter
    $adapter = new Zend_File_Transfer_Adapter_Http();
    $adapter->addFilter('Rename', array(
            'target'    => $filename,
            'overwrite' => true
    ));

    // try to receive one file
    if ($adapter->receive($file)) {
        $message = "success";
    } else {
        $message = "fail";
    }

    return $message;
}
...