如何在Symfony2.3中正确验证.stl文件上传

时间:2014-06-18 10:45:13

标签: file symfony upload binary

我的问题是关于上传.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风格正确地做到这一点吗?

感谢您的阅读。

0 个答案:

没有答案