我有一个带有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()))
,但它没有解决问题。原始内容和下载的内容仍然不同。
答案 0 :(得分:1)
所以,我最终成功地使用了addAction方法中的base64_encode()和downloadAction方法()中的base64_decode()。