2017-03-14 45 views
0

我最近開始在現有應用程序中使用Flysystem,目的是抽象本地和遠程(特別是S3)文件系統。我的開發環境一切正常,我成功配置了LocalAdapter。但是,我無法獲得S3文件下載的工作。我想指出的是,由於我可以通過在AWS管理控制檯中手動瀏覽S3存儲桶成功下載文件,所以文件上傳工作正常。話雖如此,我將跳過初始化變量$filesystem的代碼。Flysystem S3遠程文件下載總是損壞

我的應用程序使用PSR-7方法。也就是說,下面的代碼位於一個函數中,該函數將Psr\Http\Message\ServerRequestInterface類型的對象作爲第一個參數傳遞,並將一個類型爲Psr\Http\Message\ResponseInterface的對象作爲第二個參數傳遞。鑑於本地文件系統正常工作,我認爲可以肯定的是,問題不在於此。

這是代碼:

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

當我轉儲$stream變量和$filesize變量的結果如預期。遠程文件內容已成功打印。但是,文件下載始終損壞,文件大小始終爲0字節。

我假設Flysystem處理幕後的所有事情,並且在將其提供給客戶端之前,我不必先手動將文件下載到臨時文件夾。

任何線索可能是什麼問題?

更新1

我也曾嘗試用下面的代碼,沒有任何的運氣。然而,它繼續在當地工作:

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

use Zend\Diactoros\CallbackStream; 

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

回答