【问题标题】:How to fix weird encoding of file while downloading it?如何在下载文件时修复文件的奇怪编码?
【发布时间】:2019-06-20 15:18:48
【问题描述】:

我正在尝试从 postgresql 中下载一个以 base 64 编码的文件。该文件的内容在数据库bytea 中似乎很好,但是当我使用 PHP 下载它时就不一样了:

我正在使用 PHP 5.6 和 symfony 2.8。我尝试使用 base 64 解码,但没有成功。

$name = $file->getName();
$content = base64_decode(stream_get_contents($file->getContent()));
$contentType = $file->getContentType();
$response = new Response();
$response->headers->set("Cache-Control", "no-cache private");
$response->headers->set("Content-Description", "File Transfer");
$response->headers->set('Content-Type', $contentType);
$response->headers->set('Content-Disposition', 'attachment; filename="' . $name . '"');
$response->headers->set("Content-Transfer-Encoding", "binary");
$response->headers->set('Content-Length: ', strlen($content));
$response->sendHeaders();
$response->setContent($content);
return $response;

对于这个例子,我用 notepad++ 创建了一个包含字符串“test”的文件。在数据库中显示为“dGVzdA==”。

当我下载文件并解码时,内容是这个“Ǯ8kθطw”,应该是“test”。

【问题讨论】:

  • 尝试不带$response->headers->set("Content-Transfer-Encoding", "binary"); 标头。您从数据库发布的内容按预期正确解码。
  • 仍然是这个:Ǯ8kθطw
  • 我会先删除除Content-Disposition 之外的所有标题,看看是否有帮助。如果确实如此,则开始重新添加标题,直到找到破坏内容的标题。您可能还想var_dump($contentType); 看看它包含什么(它可能不是您所期望的)。
  • 内容类型为:"application/pdf"
  • 就像我说的,删除除那个之外的所有标题。

标签: php postgresql symfony-2.8


【解决方案1】:

PGSQL 正在将我的文件转换为十六进制值。 它需要被解码。 而且,PQGSQL 响应的开头有一个“/”。它需要被删除。

这是我对内容的处理:

$content = base64_decode(hex2bin(
    substr(
        stream_get_contents(
            $file->getContent()
        )
    ,1)
));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-09
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    相关资源
    最近更新 更多