我有一个Symfony控制器来上传.docx
个文件,另一个用来下载它。
我下载文件的symfony控制器如下所示:
public function getDocumentationAction(Request $request, $uriFile) {
$filename = $uriFile;
$path = $this->getParameter('documents_directory').'/'.$filename;
$file = file_get_contents($path);
$response = new Response($file);
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
$response->headers->set('Content-Description', 'File Transfer');
$response->headers->set('Content-Disposition', 'attachment; filename="'.$filename.'"');
return $response;
}
问题是当下载文件时,文件的格式不正确。例如,如果我上传包含test
字词的docx,当我下载此文件时,我会收到一个奇怪的.docx
,其中包含:
PK!>¸ï7f[Content_Types] .xml¢(†¥TÀn¬0ºWÍ?DæVâ°™™˙8∂H•
Ï XıKˆÚ˙˚nDUA*Â)YÔÃÏσɗ⁄öl 1iÔJ÷/z,'Ω“nV≤è…K~œ≤Ѭ)aºÉím ±—˙j0ŸHuªT≤9bx‡<…9Xë ¿Q•Ú— §◊8„A»O1~€Î›qÈÇ√k6<A%≥Á5}fi*â
ÀΣkÆíâåñI)_:ıÉ%fl1'ŸúIs“
如果我将这个奇怪的docx文件转换为PDF,例如使用:https://online2pdf.com/en/convert-docx-to-pdf我会在里面找到一个带有test
字的PDF,所以信息在其中,但它没有正确显示。
我的Symfony上传控制器似乎运行良好,因为我可以从服务器访问文件,并正确查看内容。
答案 0 :(得分:1)
您必须返回二进制响应。 你有两个选择:
$fileName = 'your_docx.docx';
$path = $this->getParameter('documents_directory').'/'.$filename;
$content = file_get_contents($path);
$response = new Response();
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
$response->headers->set('Content-Disposition', 'attachment;filename="'.$filename);
$response->setContent($content);
return $response;
请参阅:https://stackoverflow.com/a/30254080/6635967
另一种方法是:
$fileName = 'your_docx.docx';
$temp_file = $this->getParameter('documents_directory').'/'.$filename;
$response = new BinaryFileResponse($temp_file);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$fileName
);
return $response;
在此处找到:http://ourcodeworld.com/articles/read/361/how-to-create-a-word-file-with-php-in-symfony-3