(OT) Re: ZLIB

Ernesto Revilla erny en sicem.biz
Jue Oct 13 23:22:05 CEST 2005


Hola.
Bueno, no me entero muy bien lo que quieres, por eso repito lo que he 
entendido:
* tienes una serie de archivos locales en el sistema de archivos
* quieres proporcionar estos archivos a los usuarios de la Web
Hmm, eso no puede ser, ¿verdad? Porque los almacenarías comprimido 
dentro o fuera de Zope.
¿Son archivos que siempre son diferentes?
¿Son muy grandes?
Podría ser algo como:

Esto esto en un archivo externo, para el que después creas un objeto 
"External Method"
que lo llamas, por ejemplo, getArchivoZipExterno y que tiene un parámetro:
from StringIO import StringIO
from zipfile import ZipFile, ZIP_DEFLATED
def getArchivoZip(filename):
    sio = StringIO()
    zf=ZipFile(sio, mode="w", compression=ZIP_DEFLATED)
    zf.write(filename)
    zf.close()
    return sio.getvalue()

Ahora, en vez de hacer un template, mejor un script, digamos
Nombre: getArchivoZip
Parámetros: filename
Código:
request = context.REQUEST
request.RESPONSE.setHeader('Content-Type', 'application/x-*zip*-compressed')
return context.getArchivoZipExterno(filename)

(Con Zope Page Template también se puede hacer:
<span tal:replace="structure 
python:request.RESPONSE.setHeader('Content-Type', 
'application/x-*zip*-compressed')" /><span tal:replace="structure 
python:context.getArchivoZipExterno(context.request['filename'])" />
)


Ahora puedes conseguir cualquier archivo al que el proceso de Zope pueda 
acceder, comprimido, con http://localhost/getArchivoZip?filename=/etc/passwd

Así que más vale, en el metodo externo limitarlo a sólo servir los 
archivos de un directorio.

El problema de todo esto es que carga todo el comprimido en memoria lo 
que es poco escalable. No sé cómo hacerlo. Podrías usar un archivo 
temporal de alguna manera y mandar eso, aunque no sé cómo se le puede 
pasar a Zope un descriptor de archivo directamente. Podrías usar algo 
como LocalFS o ExternaFile o así, para poder acceder al archivo.

Suerte,
Erny

Catalin Lungu wrote:

> Hola Erny,
> Pues ni siquiera sabia de la existencia de zipfile, con ella me vale. 
> Mira te voy a hacer una pregunta mitad Python, mitad Zope porque he 
> visto que te enteras de los 2. Tengo unos ficheros en Zope añadidos 
> con el objeto File. Desde una PageTemplate llamo a una external method 
> pasandole como parametro una lista con la ruta de varios de esos 
> ficheros. En el external method a trevez del urllib leo los ficheros, 
> los comprimo y tengo la intención de subir el fichero comprimido como 
> un link para que se pude descargar que por cierto no tengo ni ideea de 
> hacerlo. De todas formas esta solución no me vale porque como tengo 
> muchos ficheros el urllib.urlopen tarda un par de segundos, pues 
> imaginate multiplicado por 20-30 ficheros. No se si hay alguna forma 
> de hacerlo directamente desde Zope, el external method que sirva 
> simplemente para comprimir.
>
> Un saludo,
> Perdon por hacer preguntas Zope en el foro de Python
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
>




Más información sobre la lista de distribución Python-es