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


From html file object to Symfony file object

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

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

编辑:

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

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

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] 时它似乎是 ["图像"]。

如果脚本停止在 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");

我认为你可以这样做:

$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数组的数组

简单的解决方案是创建一个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