Slim 3 Framework - 如何 return 生成文件?
Slim 3 Framework - How to return a generated file?
在下面的代码片段中,$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));
}
将内容转换为流的正确方法是什么?
使用 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');
}
在下面的代码片段中,$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));
}
将内容转换为流的正确方法是什么?
使用 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');
}