我有一个非常好的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)似乎输出为空或阻止脚本。
答案 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)
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