从html文件对象到Symfony文件对象

时间:2013-09-13 15:55:18

标签: php html symfony symfony-forms

我有一个非常好的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
)

我有另一个网页表单,没有Symfony实现或集成的纯HTML。因此,如您所知,来自此类表单的已发布文件将具有此表单(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对象。

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

修改

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

        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)似乎输出为空或阻止脚​​本。

3 个答案:

答案 0 :(得分: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是包含gifts_add数组的数组

答案 1 :(得分:2)

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");

答案 2 :(得分:0)

简单的解决方案是使Symfony Type绑定数据。您仍然可以使用自己的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