【问题标题】:From html file object to Symfony file object从 html 文件对象到 Symfony 文件对象
【发布时间】:2013-09-13 15:55:18
【问题描述】:

我有一个非常好的 Symfony 函数,它从一个发布的表单(在 symfony 上生成)进行一些文件操作,这个函数的输入是一个 UploadedFile 对象和这个对象的一个​​例子 (print_r)是:

Symfony\Component\HttpFoundation\File\UploadedFile Object
(
    [test:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 
    [originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => Untitled-10001.png
    [mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => image/png
    [size:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 8718
    [error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0
    [pathName:SplFileInfo:private] => /tmp/phpduxlg4
    [fileName:SplFileInfo:private] => phpduxlg4
)

我有另一个 web 表单,纯 html,没有 Symfony 实现或集成。因此,您所知道的这种形式的已发布文件将具有以下形式(print_r):

Array
(
    [gifts_add] => Array
        (
            [name] => Array
                (
                    [image] => Untitled-10001.png
                )

            [type] => Array
                (
                    [image] => image/png
                )

            [tmp_name] => Array
                (
                    [image] => /tmp/phpduxlg4
                )

            [error] => Array
                (
                    [image] => 0
                )

            [size] => Array
                (
                    [image] => 8718
                )

        )

)

我无法修改处理文件的函数,所以我需要一种方法将示例二中的正常上传文件对象从第一个“转换”为 Symfony uploadFile 对象。

我知道这是一个 hack,所以不是一个非常干净的解决方案,但目前是我解决这个问题的唯一方法,所以在简历中,如果你有一个像第二个这样的对象,你如何让它看起来像第一个一个?

编辑:

根据答案,这是我目前得到的:

        print_r($_FILES);
        print_r($gift->getImage( ));

        echo '---';

        $myfile= new \Component\HttpFoundation\File\UploadedFile();
        $myfile->setOriginalName($_FILES["gifts_add"]["name"][0]);
        $myfile->setMimeType($_FILES["gifts_add"]["type"][0]);
        $myfile->setSize($_FILES["gifts_add"]["size"][0]);
        $myfile->setError($_FILES["gifts_add"]["error"][0]);
        $myfile->setPathName($_FILES["gifts_add"]["tmp_name"][0]);
        $myfile->setFileName($_FILES["gifts_add"]["name"][0]); 


        print_r($myfile); 

        die('DEBUG');    

仍然 print_r($myfile) 似乎输出为空或阻止脚​​本。

【问题讨论】:

    标签: php html symfony symfony-forms


    【解决方案1】:

    Symfony 2.3 API UploaderFile

    UploaderFile 构造函数定义如下:

    __construct(string $path, string $originalName, string $mimeType = null, integer $size = null, integer $error = null, Boolean $test = false)
    

    尝试使用构造函数。而且我认为您在 print_r 中使用 [0] 时似乎是 ["image"]。

    如果脚本在 print_r() 上停止工作,请尝试改用 var_dump()。

    最终代码:

        print_r($_FILES);
    
        echo '---';
        $myfile= new \Component\HttpFoundation\File\UploadedFile(
            $_FILES["gifts_add"]["tmp_name"]["image"],
            $_FILES["gifts_add"]["name"]["image"],
            $_FILES["gifts_add"]["type"]["image"],
            $_FILES["gifts_add"]["size"]["image"],
            $_FILES["gifts_add"]["error"]["image"]
        );
    
        var_dump($myfile);
        die("DEBUG");
    

    【讨论】:

    • 仍然没有输出,并且脚本被阻止,使用这个:print_r($_FILES);回声's1'; $myfile= new \Component\HttpFoundation\File\UploadedFile($_FILES["gifts_add"]["tmp_name"]["image"], $_FILES["gifts_add"]["name"]["image"], $ _FILES["gifts_add"]["type"]["image"],$_FILES["gifts_add"]["size"]["image"],$_FILES["gifts_add"]["error"]["image "]);回声's2'; var_dump($myfile);死(“调试”); $_Files 输出后我只得到了 S1
    • 您的 php.ini 中是否有 error_reporting E_ALL 并且正在使用 app_dev.php 进行检查?如果有问题,它应该会显示错误。
    • 致命错误:在 /var/www/src/Done/PunctisBundle/Controller/BrandController.php 中找不到类 'Done\PunctisBundle\Controller\Symfony\Component\HttpFoundation\File\UploadedFil‌​e'在线 1431
    • 将这个添加到标题中:使用 Symfony\Component\HttpFoundation\File\UploadedFile;直接使用它: $myfile= new UploadedFile([...]);
    • 我还拿走了 ["image"] 并添加了您建议的 "use",现在正在工作!。谢谢!
    【解决方案2】:

    我认为你可以这样做:

    $myfile= new \Component\HttpFoundation\File\UploadedFile()
    $myfile->setOriginalName($array["gifts_add"]["name"][0]);
    $myfile->setMimeType($array["gifts_add"]["type"][0]);
    $myfile->setSize($array["gifts_add"]["size"][0]);
    $myfile->setError($array["gifts_add"]["error"][0]);
    $myfile->setPathName($array["gifts_add"]["tmp_name"][0]);
    $myfile->setFileName($array["gifts_add"]["name"][0]); // if you want to keep the original name
    

    $array 是包含您的 gift_add 数组的数组

    【讨论】:

    • 我在我的文件中添加了“$”我想你忘记了,我仍然得到我的空输出
    • 是的,对不起,我忘了:)
    【解决方案3】:

    简单的解决方案是创建一个 Symfony 类型来绑定数据。您仍然可以使用自己的 html 表单,但可以用 symfony 的方式捕获它。

    使用您的字段定义表单:

    $builder->add('gifts_add', 'file')
    

    在这种情况下创建一个名为 Gift 的实体来存储您的数据并接收上传文件。

    Class Gift {
        public getGiftsAdd(Symfony\Component\HttpFoundation\File\UploadedFile $file) {
            //call your function here
        }
    ....
    

    在控制器中初始化表单、实体并提交数据:

    $gift=new Gift();
    $form=$this->createForm(new YourGiftsType(), $entity);
    $form->submit($gift);
    $gift <--- your data is there now and the form automatically call your funciton
    

    【讨论】:

    • 你能用一个例子详细说明你的答案吗?
    • 谢谢,我仍然不能让它工作,我认为 Rachid O. 答案最容易实现,但我又不能让它工作,知道为什么吗?
    • 你能检查一下 $_FILES["gifts_add"]["name"][0] 是否正确吗?我认为应该是 $_FILES["gifts_add"]["name"]["image"]。
    • 错误但不是问题,使用 app_dev 这是我得到的错误: 致命错误:Class 'Done\PunctisBundle\Controller\Symfony\Component\HttpFoundation\File\UploadedFile' not found in /第 1431 行的 var/www/src/Done/PunctisBundle/Controller/BrandController.php 你怎么看?
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2013-09-02
    • 2012-04-21
    • 1970-01-01
    • 2017-01-19
    • 2019-09-20
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多