1

デバッグを有効にしましたが、何も表示されません。「500InternalServerError。このスクリプトで何が間違っているのですか?」と表示されるだけです。

Python

import zipfile
from zipfile import ZipFile
import cStringIO as StringIO
from django.http import HttpResponse
from django.core.servers.basehttp import FileWrapper

def zipit (request):
  files = ['/home/dbs/public_html/download/codex/video.html', '/home/dbs/public_html/download/audio/audio.html']
  buffer= StringIO.StringIO()
  z= zipfile.ZipFile( buffer, "w" )
  [z.write(f) for f in files]
  z.close()
  response = HttpResponse(FileWrapper(z), content_type='application/zip')
  response['Content-Disposition'] = 'attachment; filename=z.zip'
  return HttpResponse(response, mimetype="application/x-zip-compressed")
4

2 に答える 2

3

これを試して:

import zipfile
from zipfile import ZipFile
import cStringIO as StringIO
from django.http import HttpResponse
from django.core.servers.basehttp import FileWrapper
import os

def zipit (request):
    files = ['/home/dbs/public_html/download/codex/video.html', '/home/dbs/public_html/download/audio/audio.html']
    buffer = StringIO.StringIO()
    z = zipfile.ZipFile(buffer, "w")
    [z.write(f, os.path.join('codex', os.path.basename(f))) for f in files]
    z.close()
    buffer.seek(0)
    response = HttpResponse(buffer.read())
    response['Content-Disposition'] = 'attachment; filename=z.zip'
    response['Content-Type'] = 'application/x-zip'
    return response

ただし、django がバイナリ ファイルを返さないようにしてください。このために設計されたものではありません。http サーバーで処理する必要があります。

于 2012-06-14T18:51:57.180 に答える
0

上記の回避策は機能しますが、zip 全体をメモリにロードし、ファイルシステムを利用しないという欠点があります。大きなアーカイブを作成している場合、アプリケーションに深刻なメモリ負荷がかかる可能性があります。ファイルシステムを活用できる同様のアプローチを次に示します。

# imports omitted
def zipfileview(request):
    fd, fpath = tempfile.mkstemp()
    os.close(fd) # don't leave dangling file descriptors around...
    with zipfile.ZipFile(fpath, "w") as zip:

        # write files to zip here

        # when done send response from file
        response = HttpResponse(FileWrapper(open(fpath, 'rb')), mimetype="application/zip")
        response["Content-Disposition"] = "attachment; filename=myzip.zip"
        return response
于 2013-06-01T16:38:50.357 に答える