我的问题是关于上传.stl。以下是从维基百科中获取的.stl的简要说明:
STL(STereoLithography)是立体光刻的原生文件格式[...]
STL格式指定 ASCII和二进制表示。二进制文件更常见,因为它们更紧凑。
因此应用程序必须处理二进制和ASCII表示(两者都是.STL扩展名)。 文件命令返回的二进制文件:
$ file foo.stl -i
foo.stl: application/octet-stream; charset=binary
问题是我的表单接受所有文件(图片,文档,...)和所有.stl文件都是bin。
我跟着symfony cookbook on file uploads创建了我的Model类,看起来像是:
class Model {
/**
* Model file
*
* @var File
*
* @Assert\File(
* maxSize = "50M",
* mimeTypes = { "application/octet-stream"},
* maxSizeMessage = "The maxmimum allowed file size is 50MB.",
* )
*/
protected $file;
(...)
/**
*
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->file) {
$filename = sha1(uniqid(mt_rand(), true));
$this->path = $filename.'.stl';
}
}
(...)
}
你可以看到我强制扩展名为.stl(它不是很漂亮,但它是一次尝试)。
以下是相关的FormType:
class ModelType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', 'file', array('attr' => array('accept' => '*.stl')));
}
(...)
}
最后控制器(Model是Product的一部分,ProductType在他的buildForm方法中有一个新的ModelType):
public function createAction() {
$user = $this->get('security.context')->getToken()->getUser();
$product = new Product;
$form = $this->createForm(new ProductType, $product);
$request = $this->get('request');
if ($request->isMethod('POST')) {
$form->bind($request);
if ($form->isValid()) { //Always valid with any file
(... persist, flush and redirection)
}
}
return $this->render('MyBundle:Product:create.html.twig', array('form' => $form->createView()));
}
似乎Assert(即使我的表单中的accept属性)在这里也不起作用,因为我总是被重定向。关于Symfony1,我读了很多东西但很多。
你有任何想法用Symfony2风格正确地做到这一点吗?
感谢您的阅读。