在Django中为生成的zip文件设置正确的权限

Her*_*aaf 7 python django permissions zip

我正在使用Django和Python2.6为每个用户生成自定义渲染的Django模板的zip文件,以下载定制zip文件.目前,代码views.py如下所示:

def download(request):
    response = HttpResponse(mimetype='application/x-zip-compressed')
    response['Content-Disposition'] = 'attachment; filename=download.zip'

    myzip = zipfile.ZipFile(response, 'w')

    now = datetime.datetime.now()
    zipInfo = zipfile.ZipInfo('thefile.txt', (now.year, now.month, now.day, now.hour, now.minute, now.second))
    myzip.writestr(zipInfo, render_to_string('template.txt', locals(), context_instance=RequestContext(request)))
    myzip.close()

    return response
Run Code Online (Sandbox Code Playgroud)

大多数情况下,这工作正常:txt正确下载zip文件(在此示例中包含单个文件),我可以提取内容.但是,唯一的问题是,生成的文件的权限既不readwrite我的默认用户,也不是我的网站用户.

如何在下载之前更改自动生成文件的权限?

更新:

我已尝试使用,os.chmod并且os.fchmod正如迈克所建议的那样,但这需要一个路径名(我没有)或给出错误(for fchmod):

ZipFile instance has no attribute '__trunc__'

我想,一个选项是首先保存zip文件,设置权限,然后允许下载,但这似乎有点矫枉过正 - 必须有更好的方法来克服这个简单的问题.任何人有任何建议或想法?

Update2:

似乎这个问题仅限于Unix系统,因为它在Windows和(显然)OS X中运行良好.我在这里找到了类似的线程.据我所知,它必须与writestr方法有关.如何设置添加到zip文件的文件的权限writestr

zee*_*kay 4

我认为这是您用来提取 zip 的任何内容的问题。这些权限对我来说似乎很好:

zk@fool:~/Downloads% ls -l | grep thefile
-rwxr-xr-x@  1 zk  staff           9 May  3 06:37 thefile.txt*
Run Code Online (Sandbox Code Playgroud)

对于我来说,在 osx 和 windows 的内置 zip 资源管理器和 7-zip 上使用 Archive Utility 效果很好。检查生成的 zip 显示文件根本没有属性。所以我怀疑您用来解压缩文件的任何内容只是错误地设置了权限。

您可以尝试设置 ZipInfo.external_attr:

zipInfo.external_attr = 0777 << 16L # set permissions on file
Run Code Online (Sandbox Code Playgroud)

似乎修复了Linux系统上的权限:

zk@arch:~% ls -l | grep thefile
-rwxrwxrwx  1 zk     9 May  3 07:06 thefile.txt*
Run Code Online (Sandbox Code Playgroud)

  • @zeekay:但它必须是`zipInfo.external_attr = 0777 &lt;&lt; 16L` (2认同)