2012-07-15 16 views
6

Si realizo la url de un archivo zip el href de un enlace y hago clic en el enlace, mi archivo comprimido se descarga y al abrirlo obtiene los contenidos como esperaba.¿Al abrir el archivo zip descargado se crea el archivo cpgz?

Así es que HTML:

<a href="http://mysite.com/uploads/my-archive.zip">download zip</a> 

El problema es que me gustaría el enlace para que apunte a mi solicitud de tal manera que pude determinar si el usuario está autorizado a acceder a este archivo zip.

así que me gustaría que mi HTML para ser la siguiente:

<a href="/canDownload">download zip</a> 

y mi PHP para la página /canDownload:

//business logic to determine if user can download 

if($yesCanDownload){ 

$archive='https://mysite.com/uploads/my-archive.zip'; 
header("Content-Type: application/zip"); 
header("Content-Disposition: attachment; filename=".basename($archive)); 
header("Content-Length: ".filesize($archive)); 
ob_clean(); 
flush(); 
echo readfile("$archive"); 
} 

Por lo tanto, creo que el problema tiene que ver con el código header() pero he intentado un montón de cosas relacionadas con eso, basadas en varias sugerencias de Google y otras SO, y ninguna funciona.

Si su respuesta a mi pregunta, es probable que pueda responder a esta pregunta también: Zipped file with PHP results in cpgz file after extraction

+0

¿Qué es un archivo * cpgz *? – hakre

+0

En aras de la simplicidad, me referí a él como un archivo cpgz, pero en realidad es un archivo 'xxx.zip.cpgz'. Desde google, creo que es un comprimido del archivo zip. Parece que estoy descargando un archivo cuyo contenido no se puede leer porque las instrucciones del encabezado() ya estaban determinadas por '/ canDownload'. –

+0

Intente cambiar la extensión a .txt y vea si tiene texto sin formato allí. – jprofitt

Respuesta

1

Ok, respondí a mi propia pregunta.

El problema principal, que originalmente no aclaraba, era que el archivo no se encontraba en mi servidor de aplicaciones. Fue en un cubo Amazon AWS s3. Es por eso que utilicé una url completa en mi pregunta, http://mysite... y no solo una ruta de archivo en el servidor. Como resulta fopen() puede abrir urls (todos los "objetos" de cubo s3, archivos a.k.a., tienen urls) así que eso es lo que hice.

Aquí está mi código final:

$zip= "http://mysite.com/uploads/my-archive.zip"; // my Amazon AWS s3 url 
header("Content-Type: archive/zip"); // works with "application/zip" too 
header("Content-Disposition: attachment; filename='my-archive.zip"); // what you want to call the downloaded zip file, can be different from what is in the s3 bucket 
$zip = fopen($zip,"r"); // open the zip file 
echo fpassthru($zip); // deliver the zip file 
exit(); //non-essential 
3

La documentación de PHP para readfile dice que va a dar salida a los contenidos de un archivo y devuelve un int.

Así que su código, echo readfile("$archive");, se hará eco de $archive (por cierto, las comillas dobles no tienen sentido aquí, así que debería eliminarlos), y entonces la salida del int que se está devolviendo. Es decir, su línea debe ser: readfile($archive);

Además, debe utilizar una ruta de acceso local (no un enlace http: //) al archivo.

En total:

if($yesCanDownload){ 
    $archive='/path/to/my-archive.zip'; 
    header("Content-Type: application/zip"); 
    header("Content-Disposition: attachment; filename=".basename($archive)); 
    header("Content-Length: ".filesize($archive)); 
    ob_clean(); 
    flush(); 
    readfile($archive); 
} 

Por último, si eso no funciona, asegúrese de que está volviendo filesize($archive) la longitud exacta del archivo.

+0

gracias @cegfault por su ayuda. Necesito usar un 'http: //' porque el archivo zip está realmente en un servidor remoto. Así que, sí, ahora que me estoy dando cuenta, readfile() no tiene sentido en este contexto. ¿Tienes alguna otra sugerencia? –

+0

¿cómo está cargando el archivo remoto? ese es probablemente el problema. Vi que podrías estar usando un cubo S3.Tuve un problema en Rackspace CloudFiles donde el archivo también estaba leyendo los encabezados, y había algunos CRLF adicionales ("\ r \ n") en el archivo. asegúrese de llamar el archivo correctamente; pruébelo primero con un archivo .txt o algo así. Si aún tiene problemas, publique su código S3 real (elimine el nombre de usuario/apikey/etc), ya que podría tratarse del problema. – cegfault

+0

hola @cegfault, actualmente no tengo ningún código S3 en mi archivo php '/ canDownload'. Lo que tengo es exactamente lo que ves. Estoy aprendiendo S3 SDK. Veo que hay una llamada [getObject] (http://docs.amazonwebservices.com/AWSSDKforPHP/latest/#m=AmazonS3/get_object) pero no estoy seguro de cómo adaptarla a mi situación. No soy un novato total, ya que puedo subirlo a mi S3, pero aun así estoy algo confundido, ¿podría aconsejarme? –

1

Estás pasando el URL para readfile() como:

$archive = 'https://mysite.com/uploads/my-archive.zip'; 

Mientras que usted debe pasar la ruta de acceso en el servidor, por ejemplo:

$archive = '/uploads/my-archive.zip'; 

Suponiendo que el archivo se encuentra en la carpeta de carga .

tratar Adicionalmente los siguientes encabezados:

header("Content-type: application/octet-stream"); 
header("Content-disposition: attachment; filename=file.zip"); 
+0

El zip está realmente en un cubo S3 y no en mi aplicación. Mi pregunta parecía bastante complicada, así que es por eso que necesitaba incluir la URL completa. –

5

La respuesta en mi caso era que había una línea que se emite vacío antes readfile().

por lo que añade:

ob_end_clean();

readfile ($ archivo);

Pero probablemente debería buscar el lugar donde esta línea se está imprimiendo en su código.

+0

Brillante, gracias. – BarryMode

+0

Perfecto, gracias – SOSTheBlack

2

Otra posible respuesta, me encontré Después de mucho buscar, encontré que las dos razones posibles para un *.zip "descomprimir" a un *.zip.cpgz son:

  1. el archivo *.zip está dañado
  2. la "descomprimir" herramienta que se utiliza no puede mango> archivos de 2 GB

ser un usuario de Mac, la segunda razón fue la causa de mi problema de descomprimir el archivo: la herramienta estándar de Mac OS es Archive Utility, y aparentemente no puede manejar archivos> 2GB. (El archivo en cuestión para mí era una imagen de disco comprimida de 4 GB raspbian)

Lo que terminé haciendo fue utilizar una máquina virtual Debian, que ya existía en Virtual Box en mi Mac. unzip 6.0 en Debian 8.2 no tuvo problemas para descomprimir el archivo.

Cuestiones relacionadas