2

在我的 Restful API 中,我想一次调用上传文件。在我的测试中,表单同时被初始化和绑定,但是我所有的数据字段表单都是空的,结果是我的数据库中的一条空记录。

如果我通过表单视图然后提交它,一切都很好,但我想一次调用 Web 服务。Web 服务注定要由主干应用程序使用。

谢谢你的帮助。

我的测试:

$client = static::createClient();
$photo = new UploadedFile(
        '/Userdirectory/test.jpg',
        'photo.jpg',
        'image/jpeg',
        14415
);
$crawler = $client->request('POST', '/ws/upload/mydirectory', array(), array('form[file]' => $photo), array('Content-Type'=>'multipart/formdata'));

有我的控制器动作:

public function uploadAction(Request $request, $directory, $_format)
{
    $document = new Media();
    $document->setDirectory($directory);
    $form = $this->createFormBuilder($document, array('csrf_protection' => false))
        /*->add('directory', 'hidden', array(
             'data' => $directory
        ))*/
        ->add('file')
        ->getForm()
    ;
    if ($this->getRequest()->isMethod('POST')) {

        $form->bind($request);
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($document);
            $em->flush();
            if($document->getId() !== '')
                return $this->redirect($this->generateUrl('media_show', array('id'=>$document->getId(), 'format'=>$_format)));
        }else{
            $response = new Response(serialize($form->getErrors()), 406);
            return $response;
        }
   }

    return array('form' => $form->createView());
}

我的媒体实体:

    <?php

    namespace MyRestBundle\RestBundle\Entity;
    use Symfony\Component\Serializer\Normalizer\NormalizableInterface;
    use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    use Symfony\Component\HttpFoundation\Request;
    /**
     * @ORM\Entity
     * @ORM\HasLifecycleCallbacks
     */
    class Media
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;

        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        protected $path;

        public $directory;

        /**
         * @Assert\File(maxSize="6000000")
         */
        public $file;

        /**
         * @see \Symfony\Component\Serializer\Normalizer\NormalizableInterface
         */
        function normalize(NormalizerInterface $normalizer, $format= null)
        {
            return array(
                'path' => $this->getPath()
            );
        }

        /**
         * @see
         */
        function denormalize(NormalizerInterface $normalizer, $data, $format = null)
        {
            if (isset($data['path']))
            {
                $this->setPath($data['path']);
            }
        }

        protected function getAbsolutePath()
        {
            return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
        }

        protected function getWebPath()
        {
            return null === $this->path ? null : $this->getUploadDir().'/'.$this->path;
        }

        protected function getUploadRootDir()
        {
            // the absolute directory path where uploaded documents should be saved
            return __DIR__.'/../../../../web/'.$this->getUploadDir();
        }

        protected function getUploadDir()
        {
            // get rid of the __DIR__ so it doesn't screw when displaying uploaded doc/image in the view.
            return 'uploads/'.(null === $this->directory ? 'documents' : $this->directory);
        }

        /**
         * @ORM\PrePersist()
         * @ORM\PreUpdate()
         */
        public function preUpload()
        {
            if (null !== $this->file) {
                // do whatever you want to generate a unique name
                $this->path = $this->getUploadDir().'/'.sha1(uniqid(mt_rand(), true)).'.'.$this->file->guessExtension();
            }
        }

        /**
         * @ORM\PostPersist()
         * @ORM\PostUpdate()
         */
        public function upload()
        {
            if (null === $this->file) {
                return;
            }

            // if there is an error when moving the file, an exception will
            // be automatically thrown by move(). This will properly prevent
            // the entity from being persisted to the database on error
            $this->file->move($this->getUploadRootDir(), $this->path);

            unset($this->file);
        }

        /**
         * @ORM\PostRemove()
         */
        public function removeUpload()
        {
            if ($file = $this->getAbsolutePath()) {
                unlink($file);
            }
        }

        /**
         * Set Directory
         *
         * @param string $directory
         * @return Media
         */
        public function setDirectory($directory)
        {
            $this->directory = $directory;

            return $this;
        }

        /**
         * Set Path
         *
         * @param string $path
         * @return Media
         */
        public function setPath($path)
        {
            $this->path = $path;

            return $this;
        }

        /**
         * Get path
         *
         * @return string
         */
        public function getPath()
        {
            $request = Request::createFromGlobals();
            return $request->getHost().'/'.$this->path;
        }

        /**
         * Get id
         *
         * @return string
         */
        public function getId()
        {
            return $this->id;
        }
    }

我的路由:

upload_dir_media:
  pattern:      /upload/{directory}.{_format}
  defaults:     { _controller: MyRestBundle:Media:upload, _format: html }
  requirements: { _method: POST }
4

1 回答 1

0

试着把这个问题分解成一个简单的状态。您将如何通过一篇文章将“文本”或变量发布到 Web 服务?因为图像只是一个长字符串。查看 php 函数imagecreatefromstringimgtostring。这通常是图像传输协议的幕后发生的事情。一旦您解决了更简单的问题,您将证明您可以解决原始问题。

于 2012-12-07T01:38:31.070 回答