Symfony2 上传 javascript blob

Posted

技术标签:

【中文标题】Symfony2 上传 javascript blob【英文标题】:Symfony2 upload javascript blob 【发布时间】:2015-01-02 04:16:00 【问题描述】:

我正在尝试使用 blob 将使用画布创建的图像上传到 symfony。 javascript 代码正在运行并且正在发送一个 blob。但是在控制器中我无法通过验证。当我尝试阅读验证时,它不包含任何错误。

我的 Foto.php 有问题吗?还是在我的控制器中?

Javascript 发送 POST:

var dataURL = canvas.toDataURL("image/png", 0.5);
var blob = dataURItoBlob(dataURL);        
var formData = new FormData();
formData.append('file', blob);

var xhr = new XMLHttpRequest();
// Add any event handlers here...
xhr.open('POST', ' path("foto_uploadwebcam" ) ', true);
xhr.send(formData);


function dataURItoBlob(dataURI) 
    // convert base64/URLEncoded data component to raw binary data held in a string
    var byteString;
    if (dataURI.split(',')[0].indexOf('base64') >= 0)
    byteString = atob(dataURI.split(',')[1]);
    else
        byteString = unescape(dataURI.split(',')[1]);

    // separate out the mime component
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

    // write the bytes of the string to a typed array
    var ia = new Uint8Array(byteString.length);
    for (var i = 0; i < byteString.length; i++) 
        ia[i] = byteString.charCodeAt(i);
    

    return new Blob([ia], type:mimeString);

Foto.php(部分)

/**
* Foto
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Yeouuu\FotoBundle\Entity\FotoRepository")
* @ORM\HasLifecycleCallbacks
*/
class Foto
      
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

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

/**
 * Sets file.
 *
 * @param UploadedFile $file
 */
public function setFile(UploadedFile $file = null)

    $this->file = $file;
    // check if we have an old image path
    if (isset($this->path)) 
        // store the old name to delete after the update
        $this->temp = $this->path;
        $this->path = null;
     else 
        $this->path = 'initial';
    


/**
 * @ORM\PrePersist()
 * @ORM\PreUpdate()
 */
public function preUpload()

    if (null !== $this->getFile()) 
        // do whatever you want to generate a unique name
        $filename = sha1(uniqid(mt_rand(), true));
        $this->path = $filename.'.'.$this->getFile()->guessExtension();
    


/**
 * @ORM\PostPersist()
 * @ORM\PostUpdate()
 */
public function upload()

    if (null === $this->getFile()) 
        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->getFile()->move($this->getUploadRootDir(), $this->path);

    //$this->fixOrientation($this->getAbsolutePath());
    //create polaroid
    $this->effectPolaroid($this->getAbsolutePath(), 3);

    // check if we have an old image
    if (isset($this->temp)) 
        // delete the old image
        unlink($this->getUploadRootDir().'/'.$this->temp);
        // clear the temp image path
        $this->temp = null;
    
    $this->file = null;


还有控制器:

public function uploadwebcamAction(Request $request)
        

    $foto = new Foto();
    $form = $this->createFormBuilder($foto, array('csrf_protection' => false))
        ->add('file', 'file')
        ->getForm();

    $form->handleRequest($request);

    if ($form->isValid()) 
        $em = $this->getDoctrine()->getManager();
        $em->persist($foto);
        $em->flush();        
        return $this->redirect($this->generateUrl("foto_share", array('foto' => $foto->getId())));
    

【问题讨论】:

感谢上面的代码,稍加修改后,我发现这个想法对我自己的使用非常有用!有趣的是,这篇文章也有一年多的历史了,这只是帮助我们所有人的另一种方式!抱歉,我对此没有答案,但我很好奇您是否遇到了文件上传到目标的文件夹权限?此外,我还必须在 TWIG 中添加一些隐藏的表单字段,包括表单标签的属性:enctype="multipart/form-data"。这是为了以防其他人偶然发现这个问题并仍在寻找解决方案! @AaronBelchamber 我会尝试更新这个,并给出答案。我找到了一种方法来做我需要的事情。 @yeouuu,您可以并且应该回答您自己的问题,而不是用答案编辑您的问题。甚至还有一个 badge for it 你可能会考虑意见和赞成票。 @TonyChiboucas 这些编辑只是重命名和缩进修复...... 你能仔细检查一下你是否在 Symfony 中收到了文件吗?我过去遇到过这个问题:Javascript 正在发送文件,PHP 正在接收文件,而 Symfony 没有。如果是这样,请告诉我,我会看看我的旧修复。 【参考方案1】:

您必须在请求中添加以下标头:

enctype: multipart/form-data

否则 symfony 无法识别“部分”并且 Request->files 为空。

https://www.w3.org/TR/html5/sec-forms.html#element-attrdef-form-enctype

【讨论】:

以上是关于Symfony2 上传 javascript blob的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 限制最终用户仅上传 csv 文件

如何使用 symfony2“手动”处理文件上传?

上传图片时如何在 symfony2 奏鸣曲媒体中设置最大上传大小

使用 ajax 和 Symfony2 上传文件

Symfony2文件上传获取原始文件名

Symfony2 Sonata Media Bundle -- 上传图片时出错