你如何在CakePHP中获得所有上传的文件?

时间:2015-05-13 17:00:00

标签: php cakephp recursion file-upload cakephp-3.0

如何在 CakePHP 3.x 中获取所有上传的文件?这是我的控制器让你走上正轨。

<?php
class MyController extends AppController {
    public function upload() {
        // how to loop through all files?
    }
}

示例表格

<form action="/my/upload" method="post" enctype="multipart/form-data">
    <input type="text">
    <!-- any number of file inputs -->
    <input type="file" name="file">
    <input type="file" name="image[]">
    <textarea></textarea>
    <!-- etc. -->
    <input type="submit" value="Upload">
</form>

2 个答案:

答案 0 :(得分:2)

文件上传数据不再单独存储,因此,如果您不知道名称(出于何种原因),并且只有这一个数据块,那么您将不得不迭代在它上面,并确定哪个条目是文件上传数组,就像你在答案中显示的一样。

我个人在这种情况下使用过自定义请求类。这是一个简单的例子,其中存储处理过的文件数据的密钥,然后用于提取文件上传。

namespace App\Network;

class Request extends \Cake\Network\Request {

    /**
     * Holds the keys that are being used to store the file uploads
     * in the data array.
     *
     * @var string[]
     */
    protected $_fileKeys = [];

    /**
     * Returns all file uploads.
     *
     * @return array[]
     */
    public function files() {
        return array_intersect_key($this->data, array_flip($this->_fileKeys));
    }

    protected function _processFiles($post, $files) {
        $filesData = parent::_processFiles([], $files);
        $this->_fileKeys = array_keys($filesData);
        return array_merge($post, $filesData);
    }

}

<强>根目录/ index.php的

$dispatcher = DispatcherFactory::create();
$dispatcher->dispatch(
    \App\Network\Request::createFromGlobals(),
    new Response()
);

答案 1 :(得分:0)

回答我自己的问题。我不接受它,以防有人提出更好的东西或发现错误。

<?php
class MyController extends AppController {
    public function upload() {
        $files = $this->getFilesArray($this->request->data);
        foreach($files as $file) {
            // move_uploaded_file
        }
    }

    /**
     * Get files recursively in flat array
     *
     * @param mixed $field
     * @return array
     */
    public function getFilesArray($field) {

        if(is_array($field)) {
            if(!empty($field['tmp_name'])) {
                return [$field];
            }
            $files = [];
            foreach($field as $item) {
                $files = array_merge($files, $this->getFilesArray($item));
            }
            return $files;
        }

        return [];
    }

}