ZendFileTransferAdapterHttp on receive: error "File


ZendFileTransferAdapterHttp on receive : error "File was not found" with jQuery File Upload

关于这个问题已经有两个问题了

使用jQuery上传Zf2文件

不能得到blueimp/jQuery-File-Upload和ZF2运行

没有时候。我用代码示例在ZF2上创建问题。github.com/zendframework/zf2/issues/6291

并且也有来自另一个开发人员的请求在我的电子邮件问题,如何实现jQuery文件上传与ZF2.

github.com/blueimp/jQuery-File-Upload

所以,对许多人来说,这是一个真正的问题,没有任何手册,没有答案。在让我阅读文档之前,请注意,我已经花了很多时间来解决问题,并且已经阅读了所有文档,而不仅仅是我有这个问题。

请编写带有代码示例的手册,如如何实现它。或者只是回答,为什么我们会有这个错误以及如何解决它?

在那里我复制我的例子从ZF2问题。

我尝试使用jQuery-File-Upload只是复制标准tpl,包括css和脚本,它的工作,发送文件到我的控制器。但是控制器不工作

我的代码

public function processjqueryAction()
    {
        $request   = $this->getRequest();
        $response  = $this->getResponse();
        $jsonModel = new 'Zend'View'Model'JsonModel();
        if ($request->isPost()) {
            try {
                $datas          = [];
                $datas['files'] = [];
                $uploadPath     = $this->getFileUploadLocation();
                $uploadFiles    = $this->params()->fromFiles('files');
//                throw new 'Exception(json_encode("FILES " . serialize($_FILES)));
                // Сохранение выгруженного файла
                $adapter = new 'Zend'File'Transfer'Adapter'Http();
                $adapter->setDestination($uploadPath);
                $adapter->setValidators(array(
                    new 'Zend'Validator'File'Extension(array(
                        'extension' => array('jpg', 'jpeg', 'png', 'rtf')
                            )
                    ),
//                    new 'Zend'Validator'File'Upload()
                ));
                if (!$adapter->isValid()) {
                    throw new 'Exception(json_encode("!isValid " . implode(" ", $adapter->getMessages())));
                }
                $files = $adapter->getFileInfo();
//                throw new 'Exception(json_encode($files));
                foreach ($files as $file => $info) {
//                    throw new 'Exception(json_encode($info));
                    $name = $adapter->getFileName($file);
                    // file uploaded & is valid
                    if (!$adapter->isUploaded($file)) {
                        throw new 'Exception(json_encode("!isUploaded") . implode(" ", $adapter->getMessages()));
                        continue;
                    }
                    if (!$adapter->isValid($file)) {
                        throw new 'Exception(json_encode("!isValid " . implode(" ", $adapter->getMessages())));
                        continue;
                    }
                    // receive the files into the user directory
                    $check = $adapter->receive($file); // this has to be on top
                    if (!$check) {
                        throw new 'Exception(json_encode("! receive" . implode(" ", $adapter->getMessages())));
                    }
                    /**
                     * "name": "picture1.jpg",
                      "size": 902604,
                      "url": "http:'/'/example.org'/files'/picture1.jpg",
                      "thumbnailUrl": "http:'/'/example.org'/files'/thumbnail'/picture1.jpg",
                      "deleteUrl": "http:'/'/example.org'/files'/picture1.jpg",
                      "deleteType": "DELETE"
                     */
                    $fileclass             = new stdClass();
                    // we stripped out the image thumbnail for our purpose, primarily for security reasons
                    // you could add it back in here.
                    $fileclass->name       = $name;
                    $fileclass->size       = $adapter->getFileSize($name);
                    $fileclass->type       = $adapter->getMimeType($name);
                    $fileclass->deleteUrl  = '/uploads/delete';
                    $fileclass->deleteType = 'DELETE';
                    //$fileclass->error = 'null';
                    $fileclass->url        = '/';
                    $datas['files'][] = $fileclass;
                }
                $response->getHeaders()->addHeaders(array(
                    'Pragma'        => 'no-cache',
                    'Cache-Control' => 'private, no-cache',
                    "Content-Type"  => 'application/json'
                ));
//                return $response->setContent(json_encode(array('files' => $files)));
                return $response->setContent(json_encode($datas));
            } catch ('Exception $e) {
                return $response->setContent(json_encode($e->getMessage()));
            }
        }
        return $jsonModel;
}

抱歉调试代码,但有了它,你可以看到,我努力使它工作,超过3小时。

错误"文件'CIMG0042.JPG'未找到"

当我调用$adapter->isValid()或者当用文件名调用它时,也会出现同样的错误。上传文件的路径正确且可写。$_FILES数组存在且有效

这里是$_FILES json

FILES a:1:{s:5:'"files'";a:5:{s:4:'"name'";a:1:{i:0;s:28:'"52876065d17dce0a7472e5d6.jpg'";}s:4:'"type'";a:1:{i:0;s:10:'"image'/jpeg'";}s:8:'"tmp_name'";a:1:{i:0;s:14:'"'/tmp'/phpmfT2mB'";}s:5:'"error'";a:1:{i:0;i:0;}s:4:'"size'";a:1:{i:0;i:82640;}}}

$files = $adapter->getFileInfo();

"{"files_0_":{"name":"52876065d17dce0a7472e5d6.jpg","type":"image'/jpeg","tmp_name":"'/tmp'/phpF6VoO9","error":0,"size":"82640","options":{"ignoreNoFile":false,"useByteString":true,"magicFile":null,"detectInfos":true},"validated":false,"received":false,"filtered":false,"validators":["Zend''Validator''File''Upload","Zend''Validator''File''Extension"],"destination":"'/home'/seyfer'/www'/zend2-tutorial.me'/module'/Users'/config'/..'/..'/..'/data'/uploads"}}"

isupload通过,但isValid未通过。

我做错了什么?

文档说这个

Zend_File_Transfer已被弃用,支持使用标准的ZF2 Zend'Form和Zend'InputFilter功能。

也许这意味着Form需要以任何方式用于文件上传?

乌利希期刊指南25.05.14

现在我添加表单

class UploadJqueryForm extends BaseForm
{
    public function __construct()
    {
        parent::__construct(__CLASS__);
        $this->setAttribute('method', 'post');
        $this->setAttribute('enctype', 'multipart/form-data');
        $this->init();
    }
    public function init()
    {
        $fileupload = new Element'File('files');
        $fileupload->setLabel("files");
        $fileupload->setAttribute('multiple', 'multiple');
        $this->add($fileupload);
        $button = new Element'Button('start');
        $button->setAttribute("type", 'submit');
        $button->setValue("Start upload")->setLabel("Start upload");
        $this->add($button);
        $button = new Element'Button('cancel');
        $button->setAttribute("type", 'reset');
        $button->setValue("Cancel upload")->setLabel("Cancel upload");
        $this->add($button);
        $button = new Element'Button('delete');
        $button->setAttribute("type", 'button');
        $button->setValue("Delete")->setLabel("Delete");
        $this->add($button);
        $checkbox = new Element'Checkbox('toggle');
        $checkbox->setValue("Toggle")->setLabel("Toggle");
        $checkbox->setAttribute("required", "");
        $this->add($checkbox);
    }
}

使用它
public function processjqueryAction()
    {
        $form      = new 'Users'Form'UploadJqueryForm();
        $request   = $this->getRequest();
        $response  = $this->getResponse();
        $jsonModel = new 'Zend'View'Model'JsonModel();
        try {
            if ($request->isPost()) {
                $data = array_merge_recursive(
                        $this->getRequest()->getPost()->toArray(), $this->getRequest()->getFiles()->toArray()
                );
//                throw new 'Exception(json_encode("data " . serialize($data)));
                $form->setData($data);
                if ($form->isValid()) {
                    $datas          = [];
                    $datas['files'] = [];
                    $uploadPath     = $this->getFileUploadLocation();
//                $uploadFiles    = $this->params()->fromFiles('files');
//                throw new 'Exception(json_encode("FILES " . serialize($_FILES)));
                    // Сохранение выгруженного файла
                    $adapter        = new 'Zend'File'Transfer'Adapter'Http();
                    $adapter->setDestination($uploadPath);
                    $adapter->setValidators(array(
                        new 'Zend'Validator'File'Extension(array(
                            'extension' => array('jpg', 'jpeg', 'png', 'rtf')
                                )
                        ),
                    ));
                    if (!$adapter->isValid()) {
                        throw new 'Exception(json_encode("!isValid " . implode(" ", $adapter->getMessages())));
                    }
                    $files = $adapter->getFileInfo();
//                throw new 'Exception(json_encode($files));
                    foreach ($files as $file => $info) {
//                    throw new 'Exception(json_encode($info));
                        $name = $adapter->getFileName($file);
                        // file uploaded & is valid
                        if (!$adapter->isUploaded($file)) {
                            throw new 'Exception(json_encode("!isUploaded") . implode(" ", $adapter->getMessages()));
                            continue;
                        }
                        if (!$adapter->isValid($file)) {
                            throw new 'Exception(json_encode("!isValid " . implode(" ", $adapter->getMessages())));
                            continue;
                        }
                        // receive the files into the user directory
                        $check = $adapter->receive($file); // this has to be on top
                        if (!$check) {
                            throw new 'Exception(json_encode("! receive" . implode(" ", $adapter->getMessages())));
                        }
                        /**
                         * "name": "picture1.jpg",
                          "size": 902604,
                          "url": "http:'/'/example.org'/files'/picture1.jpg",
                          "thumbnailUrl": "http:'/'/example.org'/files'/thumbnail'/picture1.jpg",
                          "deleteUrl": "http:'/'/example.org'/files'/picture1.jpg",
                          "deleteType": "DELETE"
                         */
                        $fileclass             = new stdClass();
                        // we stripped out the image thumbnail for our purpose, primarily for security reasons
                        // you could add it back in here.
                        $fileclass->name       = $name;
                        $fileclass->size       = $adapter->getFileSize($name);
                        $fileclass->type       = $adapter->getMimeType($name);
                        $fileclass->deleteUrl  = '/uploads/delete';
                        $fileclass->deleteType = 'DELETE';
                        //$fileclass->error = 'null';
                        $fileclass->url        = '/';
                        $datas['files'][] = $fileclass;
                    }
                    $response->getHeaders()->addHeaders(array(
                        'Pragma'        => 'no-cache',
                        'Cache-Control' => 'private, no-cache',
                        "Content-Type"  => 'application/json'
                    ));
                    return $response->setContent(json_encode($datas));
                } else {
                    throw new 'Exception(json_encode("!isValid form" . serialize($form->getMessages())));
                }
            }
        } catch ('Exception $e) {
            return $response->setContent(json_encode($e->getMessage()));
        }
        return $jsonModel;

仍然得到错误文件"24866-fu-blyad-otvratitelno.jpg"未找到

我也尝试了InputFilter

class UploadJqueryFilter extends InputFilter implements
InputFilterAwareInterface
{
    public function __construct()
    {
        $this->getInputFilter();
    }
    public function getInputFilter()
    {
        $toggle = new Input('toggle');
        $toggle->setRequired(FALSE);
        $this->add($toggle);
        $files = new 'Zend'InputFilter'FileInput('files');
        $files->setRequired(TRUE);
        $files->getValidatorChain()->attach(new Validator'File'UploadFile);
        $files->getFilterChain()->attach(new 'Zend'Filter'File'RenameUpload(array(
            'target'    => __DIR__ . '/../../../../../../tmpuploads/tmp',
            'randomize' => true,
        )));
        $this->add($files);
        return $this;
    }
    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        return false;
    }
}

我也有这个问题。浪费了几个小时才发现问题。这是因为输入标签的name属性不能设置为'files'

所以这是一个no:

<input id="files" type="file" name="files" data-url="/upload-action" />

将name属性更改为除文件以外的任何字符串,例如文件将解决此问题。

<input id="files" type="file" name="file" data-url="/upload-action" />

我从$_FILES中看到您已经将名称设置为文件。试着改变这一点。确保你也更新了你在控制器中创建的引用