我在我的symfony2项目中创建了一个包,用于处理我用来在云端保存文件的所有Web服务(如亚马逊S3)。这些web服务中的一些允许直接在其服务器上发送文件,而不使用我的表格,如下所示:
<form action="api.thecloud.com/specificId?redirectUrl=MyUrlToGetTheResponse" >
<input type="file" name="file" />
<input type="submit" />
</form>
给定的redirectUrl参数允许我从上传中获取信息并将其保存在我的数据库中。
我的问题是,我想让它对其他捆绑包透明和可自定义,例如标准的symfony表单类型。有没有办法做到这一点?
我发现的解决方案有点复杂,我认为有一种更简洁的方法:
我创建了一个表单类型,用于指定操作url:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('file', 'file');
$builder->add('otherPostUploadInformation', 'hidden');
$builder->setAction( $this->Cloudservice->generateUploadUrl( 'my_redirect_url' ) ) ;
}
public function getName(){
return '';
}
动作路径以其他方式(php或twig函数)给出并保存在会话中。
在my_redirect_url的操作中,我从webservice获取并保存信息并重定向到会话中保存的操作:
public function myRedirectUrlAction() {
$request = $this->getRequest() ;
// Recreate a form with received information
$rsrc = new CloudUploadRessource( $request->query->get( 'id' ), $request->query->get( 'url' ) );
$form = $this->createForm(new CloudUploadType(), $rsrc );
// transform it to array and add it to the request like if it has been posted
$formArray = $this->transformFormArray( $form->createView() ) ;
$request->request->add( $formArray);
// redirect to the client action url with the request
// So he can do $form->bind($request); $form->isValid(); ...
$clientActionRoute = $request->getSession()->get( 'clientActionRoute' ) ;
return $this->forward($clientActionRoute, array('request' => $request ) );
}
由于
答案 0 :(得分:0)
对于我来说,使用这些方法(将文件直接上传到第三方资源)有点奇怪。为什么不使用像https://github.com/KnpLabs/KnpGaufretteBundle这样的捆绑包。您可以根据需要配置任意数量的适配器。但在这种情况下,您只需更改test / dev env的addapters配置即可测试整个应用程序/项目。