Slim 3 Framework - 如何返回生成的文件?

时间:2017-12-15 00:49:55

标签: php download slim-3

在下面的代码段中,$file数组的内容将在浏览器中呈现。

代码有效但我认为必须有更好的方法将二进制字符串转换为流以发送到浏览器。

if (is_array($file)) {

    $filename=preg_replace('/[^A-Za-z0-9 \\._-]+/', '', $file['filename']);

    // -- This feels like a hack
    $stream = fopen('php://memory', 'r+');
    fwrite($stream, $file['content']);
    rewind($stream);
    // --

    return $response->withHeader('Content-Type', $file['mimetype'])
        ->withHeader('Content-Transfer-Encoding', 'binary')
        ->withHeader('Content-Disposition', 'inline; filename="' . basename($filename) . '"')
        ->withHeader('Expires', '0')
        ->withHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
        ->withHeader('Pragma', 'public')
        ->withBody(new \Slim\Http\Stream($stream));
}

将内容转换为流的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

使用Response对象的getBody()方法解决了问题。

if (is_array($file)) {

    if (strlen($file['filename'])) {
        $filename=preg_replace('/[^A-Za-z0-9 \\._-]+/', '', $file['filename']);
    }

    $content = $response->getBody();
    $content->write($file['content']);

    return $response->withHeader('Content-Type', $file['mimetype'])
        ->withHeader('Content-Transfer-Encoding', 'binary')
        ->withHeader('Content-Disposition', 'inline; filename="' . basename($filename) . '"')
        ->withHeader('Expires', '0')
        ->withHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
        ->withHeader('Pragma', 'public');

}