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