2017-03-14 3 views
0

Ich habe vor kurzem begonnen, Flysystem in einer bestehenden Anwendung mit der Absicht zu verwenden, die lokalen und Remote- (speziell S3) Dateisysteme zu abstrahieren. Alles funktionierte in meiner Entwicklungsumgebung, auf der ich den LocalAdapter erfolgreich konfiguriert habe. Ich kann jedoch keine S3-Dateidownloads zum Laufen bringen. Ich möchte darauf hinweisen, dass Datei-Uploads perfekt funktionieren, da ich die Datei erfolgreich herunterladen kann, indem ich den S3-Bucket in der AWS-Verwaltungskonsole manuell durchsuche. Davon abgesehen überspringe ich den Code, der die Variable $filesystem initialisiert.Flysystem S3 Remote-Datei-Download immer beschädigt

Meine Anwendung verwendet einen PSR-7-Ansatz. Das heißt, der folgende Code befindet sich in einer Funktion, die als erstes Argument ein Objekt vom Typ Psr\Http\Message\ServerRequestInterface und als zweites Argument ein Objekt vom Typ Psr\Http\Message\ResponseInterface übergeben wird. Da das lokale Dateisystem gut funktioniert, kann man davon ausgehen, dass das Problem nicht dort liegt.

Dies ist der Code:

<?php 

    $stream = new \Zend\Diactoros\Stream($filesystem->readStream($filename)); 
    $filesize = $stream->getSize(); 

    return $response 
      ->withHeader('Content-Type', 'application/pdf') 
      ->withHeader('Content-Transfer-Encoding', 'Binary') 
      ->withHeader('Content-Description', 'File Transfer') 
      ->withHeader('Pragma', 'public') 
      ->withHeader('Expires', '0') 
      ->withHeader('Cache-Control', 'must-revalidate') 
      ->withHeader('Content-Length', "{$filesize}") 
      ->withBody($stream); 

Wenn ich die $stream Variable und die $filesize Variable die Ergebnisse sind wie erwartet Dump. Der Inhalt der Remote-Datei wird erfolgreich gedruckt. Der Dateidownload ist jedoch immer beschädigt und die Dateigröße beträgt immer 0 Byte.

Ich gehe davon aus, dass Flysystem kümmert sich um alles hinter den Kulissen und dass ich die Datei nicht manuell in einen temporären Ordner herunterladen muss, bevor Sie es an den Client zu liefern.

Jeder Hinweis auf was könnte das Problem sein?

Update 1

ich auch mit dem folgenden Code versucht haben, ohne Erfolg. Allerdings bleibt es lokal arbeiten:

use Zend\Diactoros\CallbackStream; 

$stream = new CallbackStream(function() use ($filesystem, $filename) { 
    $resource = $filesystem->readStream($filename); 
    while (!feof($resource)) { 
     echo fread($resource, 1024); 
    } 
    fclose($resource); 
    return ''; 
}); 

und

use Zend\Diactoros\CallbackStream; 

$stream = new CallbackStream(function() use ($filesystem, $filename) { 
    $resource = $filesystem->readStream($filename); 
    fpassthru($resource); 
    return ''; 
}); 

Antwort

Verwandte Themen