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

7
我正在使用Django和Python2.6来生成一个zip文件,其中包含每个用户的自定义渲染Django模板,以便下载定制的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

通常情况下,这个方案是行得通的:zip文件(在这个例子中只包含一个txt文件)被正确地下载,我可以提取其中的内容。问题在于,生成的文件权限对于我的默认用户既不是读取也不是写入,对于我的网站用户也是如此。我该如何在下载前更改自动生成文件的权限?
更新:我尝试使用Mike建议的os.chmod和os.fchmod,但这要求路径名(我没有)或会出现错误(对于fchmod):
ZipFile实例没有属性'__trunc__'
我想,一个选择是先保存zip文件,设置权限,然后允许下载,但那似乎有点过度 - 必须有更好的方法来解决这个简单的问题。有人有什么建议或想法吗?
更新2:
似乎这个问题只限于Unix系统,在Windows和(显然)OS X上运行良好。我找到了一个类似的帖子在这里。据我所知,这必须与writestr方法有关。如何设置使用writestr添加到zip文件中的文件的权限?

哪个文件权限有误:下载的ZIP文件还是ZIP文件中的文本文件? - Mike DeSimone
@Mike DeSimone:压缩文件中的文本文件。 - Herman Schaaf
@vartec:是的,这似乎是我的问题的根源。响应被下载为zip文件,但内容权限不正确,我无法设置权限,因为还没有文件可以设置。 - Herman Schaaf
@Herman:我刚刚使用普通文件进行了检查,这似乎与它是Django响应还是普通文件无关。 - vartec
@vartec:我知道,我只是在阐述为什么我认为这个问题不应该被删除。 - Herman Schaaf
显示剩余5条评论
2个回答

4
我认为这可能是您用于提取zip文件的工具出了问题。权限看起来没有问题:
zk@fool:~/Downloads% ls -l | grep thefile
-rwxr-xr-x@  1 zk  staff           9 May  3 06:37 thefile.txt*

在我的苹果操作系统上,使用档案实用工具、Windows内置的zip浏览器和7-zip都能正常运行。检查生成的zip文件显示文件根本没有任何属性。因此,我怀疑你所使用的解压缩文件的程序只是错误地设置了权限。

您可以尝试设置ZipInfo.external_attr:

zipInfo.external_attr = 0777 << 16L # set permissions on file

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

zk@arch:~% ls -l | grep thefile
-rwxrwxrwx  1 zk     9 May  3 07:06 thefile.txt*

1
是的,根据这个帖子的说法,我认为这个问题仅限于Unix系统。 - Herman Schaaf
也许尝试使用ZipInfo.external_attr或internal_attr设置? - Zach Kelling
@zeekay:啊,是的,我在看到另一个帖子后自己检查了一下,问题解决了。 - Herman Schaaf
2
@zeekay:但它必须是 zipInfo.external_attr = 0777 << 16L - Herman Schaaf
是的,这确实应该被记录在文档中:http://docs.python.org/release/2.7/library/zipfile.html#zipfile.ZipInfo.external_attr - Zach Kelling

0
在Unix中,每个进程都有默认的文件权限掩码..请继续阅读:
umask
尝试为Django进程设置它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接