2010-03-09 11 views
6
respuesta HTTP

estoy evitando la creación de archivos en el disco, esto es lo que tengo hasta ahora:función para crear un archivo zip en la memoria y la de regreso si lo

def get_zip(request): 
    import zipfile, StringIO 
    i = open('picture.jpg', 'rb').read() 
    o = StringIO.StringIO() 
    zf = zipfile.ZipFile(o, mode='w') 
    zf.writestr('picture.jpg', i) 
    zf.close() 
    o.seek(0) 
    response = HttpResponse(o.read()) 
    o.close() 
    response['Content-Type'] = 'application/octet-stream' 
    response['Content-Disposition'] = "attachment; filename=\"picture.zip\"" 
    return response 

¿Cree que es correcto-elegante- lo suficientemente pitónico? ¿Alguna mejor forma de hacerlo?

Gracias!

+0

Si es correcto o no solo puede decir que solo usted sabe lo que se supone que debe hacer :) La elegancia es subjetiva, pero realmente podría funcionar con algunos espacios en blanco y tal vez se divida en múltiples funciones. También es probable que desee asegurarse de que el archivo esté cerrado en caso de errores, puede hacerlo con try-finally o con la instrucción 'with'. – Skurmedel

+2

Me gustaría señalar que, en general, no desea comprimir archivos JPEG porque ya están comprimidos. – Gabe

Respuesta

12

Para StringIO generalmente debe usar o.getvalue() para obtener el resultado. Además, si desea agregar un archivo normal al archivo zip, puede usar zf.write('picture.jpg'). No necesita leerlo manualmente.

4

Evitar archivos de disco puede ralentizar su servidor, pero sin duda funcionará.

Va a agotar la memoria si atiende muchas de estas solicitudes al mismo tiempo.

+0

@ S.Lott, tengo curiosidad, ¿la única preocupación aquí es la memoria agotadora? Pensaría que evitar escribir archivos tmp en el disco sería más rápido. Gracias. – Mark

+1

Los archivos temporales no tienen necesariamente que golpear el disco (especialmente en Linux). –

+3

@Mark: No lo sabes hasta que midas. Sin embargo, en general, los servidores web son (1) socket I/O enlazado y (2) enlazado a memoria si hay suficiente ancho de banda de socket. La E/S de disco rara vez es una consideración; el navegador del cliente suele ser lo más lento; una gran transacción de memoria vincula grandes cantidades de memoria a la espera de que el navegador del cliente termine de aceptar la transmisión. Mala política. –

Cuestiones relacionadas