2017-12-15 3 views
0

Im folgenden Codefragment wird der Inhalt des $file Arrays im Browser gerendert.Slim 3 Framework - Wie man eine generierte Datei zurückgibt?

Der Code funktioniert, aber ich denke, es muss einen besseren Weg geben, um die binäre Zeichenfolge in einen Stream zu verwandeln, um sie an den Browser zu senden.

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)); 
} 

Was ist der richtige Weg, um den Inhalt in einen Strom zu verwandeln?

Antwort

0

Problem gelöst durch Verwendung der Objekt getBody() Methode.

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'); 

}