1
def _tarFiles(filepaths):
print "create tar file from all files in file list and save to temp working dir. returns tarfile path "
try:
    savePathDir = settings.TAR_FILE_TARGET_DIRECTORY
    if not os.path.exists(savePathDir):
        os.makedirs(savePathDir)

    tarredfiles = tarfile.open(settings.TAR_FILE_TARGET_DIRECTORY + '/' + 'responsefiles.tar',mode='w')
    for f in filepaths:
        tarredfiles.add(f)

    tarredfiles.close()
    return ("Ok", settings.TAR_FILE_TARGET_DIRECTORY + '/' + 'responsefiles.tar')

except Exception as e:
    return ("Error in "+ inspect.stack()[0][3] + " " + e.message, None)

 def sendFiles(files):
    try:
        result, tarfilename = _tarFiles(files)
        if result == 'Ok':
            try:
                print tarfilename
                wrapper = FileWrapper(file(tarfilename))
                response = HttpResponse(wrapper, content_type='application/x-tar') #zip,avi,png,jpeg, etc...
                response['Content-Disposition'] = 'attachment; filename=' + tarfilename#tarredfiles.name #eg. myfile.zip
                response['Content-Length'] = str(os.path.getsize(tarfilename))
                return ("Ok",response)
            except Exception as e:
                return ("Error in "+ inspect.stack()[0][3] + " " + e.message, None)

        else:
            return (result,None)

    except Exception as e:
        return ("Error in "+ inspect.stack()[0][3] + " " +e.message,None)

tarfilenameは、ファイルへの完全なパスです。content-lengthは正しく見えます(実際のファイルをgetsizeと比較して)。

runserverを実行しているMacで動作します。runserverを実行しているWindowsで部分ファイルを返します。または、Windowsをステップスルーする場合は、ファイルを完全に空にします。

生成されるターゲットディレクトリとファイル名は「tarred_files/responsefiles.tar」です。ファイルサイズは90Kで、返されるos.path.getsizeは92160です。

空のファイルがダウンロードされる原因となるのは何ですか?

4

1 に答える 1

2

Windowsの場合、ファイルに「rb」を追加する必要があります。

そのようです:

wrapper = FileWrapper(file(tarfilename,'rb'))

また、Content-Lengthは文字列ではなく整数を使用する必要があります

そのようです:

response['Content-Length'] = os.path.getsize(tarfilename)
于 2012-04-12T22:04:14.010 に答える