如何从数据库

时间:2016-08-23 10:03:38

标签: symfony doctrine

我有一个带有addAction方法的FileController,它在我的数据库中存储了一个或多个文件:

$files = [];

$form = $this->createForm(MultipleFilesType::class, []);
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {

    $files = $form->get("files")->getData();


    foreach ($files as $key => $file)
    {
        /* @var $uploadedFile UploadedFile */
        $uploadedFile = $file["file"];

        if ($uploadedFile->getError()) {
            $request->getSession()->getFlashBag()->add('warning', $uploadedFile->getErrorMessage());
        } else {

            $file = (new File())
                    ->setName($uploadedFile->getClientOriginalName())
                    ->setContent(file_get_contents($uploadedFile->getPathname()))
                    ->setType($uploadedFile->guessExtension())
            ;

            $this->manager()->persist($file);
            $this->manager()->flush();


        }
    }
    // ...
}

然后我有downloadAction

public function _downloadAction($file, Request $request) 
{
    $response = new Response();
    $response->setContent($file->getContent());

    $d = $response->headers->makeDisposition(
        ResponseHeaderBag::DISPOSITION_ATTACHMENT, preg_replace('/[^a-zA-Z0-9-_\. ]/', "", $file->getName()) 
    );

    $response->headers->set("Content-Type", $file->getType());
    $response->headers->set('Content-Disposition', $d);

    return $response; 
}

所以我尝试了上面的所有代码。我的文件似乎上传得很好,但是当我尝试下载时,我会遇到一些问题,具体取决于文件类型。

HTML和EML文件工作正常。 Microsoft office类型文件(odt,xml等):无法打开它们,因为它们已损坏。 图像文件:我得到一个“这不是XX类型文件,文件以0xc3 0xbf开头”

所以...我的代码有什么问题?也许有一些方法可以做得更好,但我是新手上传/下载文件,我很挣扎。 另外,假设我必须使用数据库来存储文件。

编辑:

我在addAction方法中尝试了dump(file_get_contents($uploadedFile->getPathname()));,在_downloadAction中尝试了dump($file->getContent());

结果非常不同(他们不应该!!)。 第一个转储显示了许多神秘的角色,如:▓│┤ÀÀ╣║┬╣║┬├─┼ã╚╔╚╔╚╔ÊÊÊÊÎÎÎÔÔÔÔÔÔ

,第二个几乎只使用字母数字字符。

我想我确实应该在将内容存储在数据库中时尝试转义字符。 我试过mysql_escape_string(file_get_contents($uploadedFile->getPathname())),但它没有解决问题。原始内容和下载的内容仍然不同。

1 个答案:

答案 0 :(得分:1)

所以,我最终成功地使用了addAction方法中的base64_encode()和downloadAction方法()中的base64_decode()。