2013-04-18 3 views
4

Zend\Filter\File\RenameUpload 필터를 사용하여 ./data/uploads 폴더로 파일을 업로드하는 양식을 만들었습니다.Zend Framework 2 파일 다운로드

이것은 매력처럼 작동합니다. 내 문제는 지금이 파일을 다운로드하는 사용자에게 어떻게 제공합니까?

나는 그것이 같을 것이라고 생각 :

$response->setContent(file_get_contents('./data/uploads/file.png'));

을하지만 이렇게하는 가장 좋은 방법이 무엇인지 알고 싶어요.

+1

중복 가능성 [힘 다운로드하여 ZF2 (http://stackoverflow.com/questions/15219873/force-download-using-zf2) – Makoto

답변

9

감사가 응답을 @henrik 할 수 있지만, 몇 가지 중요한 헤더는 그의 대답에서 누락

public function downloadAction() { 
    $fileName = 'somefile'; 

    $response = new \Zend\Http\Response\Stream(); 
    $response->setStream(fopen($fileName, 'r')); 
    $response->setStatusCode(200); 

    $headers = new \Zend\Http\Headers(); 
    $headers->addHeaderLine('Content-Type', 'whatever your content type is') 
      ->addHeaderLine('Content-Disposition', 'attachment; filename="' . $fileName . '"') 
      ->addHeaderLine('Content-Length', filesize($fileName)); 

    $response->setHeaders($headers); 
    return $response; 
} 

여기 발견. 그걸 조심해.

헤더 전체 스택 :

public function downloadAction() { 
    $file = 'path/to/file'; 
    $response = new \Zend\Http\Response\Stream(); 
    $response->setStream(fopen($file, 'r')); 
    $response->setStatusCode(200); 
    $response->setStreamName(basename($file)); 
    $headers = new \Zend\Http\Headers(); 
    $headers->addHeaders(array(
     'Content-Disposition' => 'attachment; filename="' . basename($file) .'"', 
     'Content-Type' => 'application/octet-stream', 
     'Content-Length' => filesize($file), 
     'Expires' => '@0', // @0, because zf2 parses date as string to \DateTime() object 
     'Cache-Control' => 'must-revalidate', 
     'Pragma' => 'public' 
    )); 
    $response->setHeaders($headers); 
    return $response; 
}