zf2 zend tutorial run framework espaƱol composer zend-framework2 force-download

zend framework2 - zend - forzar la descarga usando ZF2



zend framework virtualhost (2)

Estoy tratando de hacer una descarga forzada usando ZF2. Aquí está el fragmento de mi código

use Zend/Http/Request; ..... public function downloadAction() { $response = new Request(); $response->setHeaders(Request::fromString("Content-Type: application/octet-stream/r/nContent-Length: 9/r/nContent-Disposition: attachment; filename=/"ultimate_remedy_readme.txt/"")); }

ahora estoy recibiendo este error

/var/www/whowantsmymoney/vendor/zendframework/zendframework/library/Zend/Http/Request.php:88

Mensaje:

A valid request line was not found in the provided string

Rastreo de pila:

#0 /var/www/whowantsmymoney/module/Admin/src/Admin/Controller/LanguageController.php(93): Zend/Http/Request::fromString(''Content-Type: a...'')


Este código debería ayudarte a descargar un archivo simple.

public function downloadAction() { $fileName = ''somefile''; if(!is_file($fileName)) { //do something } $fileContents = file_get_contents($fileName); $response = $this->getResponse(); $response->setContent($fileContents); $headers = $response->getHeaders(); $headers->clearHeaders() ->addHeaderLine(''Content-Type'', ''whatever your content type is'') ->addHeaderLine(''Content-Disposition'', ''attachment; filename="'' . $fileName . ''"'') ->addHeaderLine(''Content-Length'', strlen($fileContents)); return $this->response; }

Me imagino que este código deja mucho que desear, pero debería funcionar en casos simples, como el mío. No estoy seguro de cómo podría manejar la lectura del archivo en trozos. Tal vez alguien más podría arrojar algo de luz?

Editar - Enviando streams

He añadido esto aquí con fines informativos. Probablemente sea la mejor manera de forzar las descargas, ya que utilizará mucha menos memoria.

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;


Gracias a @Aydin Hassan por su respuesta, pero faltan varios encabezados importantes en su respuesta. Ten cuidado con eso.

Cabeceras llenas de pila:

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