Symfony 如何从数据库下载文件

Symfony 如何从数据库下载文件,symfony,doctrine,Symfony,Doctrine,我有一个带有addAction方法的FileController,它在我的数据库中存储一个或多个文件: $files = []; $form = $this->createForm(MultipleFilesType::class, []); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $files = $form->ge

我有一个带有
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();


        }
    }
    // ...
}
然后我有一个下载动作:

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开头”

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

编辑:

我尝试了
转储(文件获取内容($uploadedFile->getPathname())和
dump($file->getContent())在下载操作中

结果是非常不同的(而且它们不应该是!!)。 第一个转储显示了许多神秘的角色,如:▓│┤ÁÂÀ©╣║┬├─┼ãÃ╚╔╩ÊËÈıÍÎÏ┘┌ßÔõÕþÔÔÔÔÔÔÔÕÕÕÕÕÕÕ

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

我想当我在数据库中存储内容时,我确实应该尝试转义字符。
我尝试了
mysql\u escape\u字符串(file\u get\u contents($uploadedFile->getPathname())
,但没有解决问题。原始内容和下载的内容仍然不同。

因此,我最终设法做到了这一点,在addAction方法中使用base64_encode(),在downloadAction方法()中使用base64_decode()。

我总是将文件存储在磁盘中,并使用BinaryFileResponse来提供文件。从我的角度来看,在数据库中存储文件不是一个好的选择,我会尽量避免。好吧,我应该在哪里存储文件的选择不是由我决定的。只是一个猜测。但是试着在你的文件中创建一个mysql\u real\u escape\u string()或mysqli\u real\u escape\u string(),以获取内容。我不知道如何将mysql\u real\u escape\u string()与symfony2/doctor一起使用。我收到以下错误:警告:mysql\u real\u escape\u string():拒绝用户“www data”@“localhost”的访问(使用密码:否),我面临相同的问题。对我来说,我可以在控制台中获得输出。但它是作为文件下载的。有什么想法吗?