我正在使用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
大多数情况下,这样可以正常工作:正确下载zip文件(在此示例中包含单个txt
文件),我可以提取内容。但是,唯一的问题是,对于我的默认用户,生成的文件的权限既不是read
也不是write
,也不适用于我的网站用户。
如何在下载前更改自动生成文件的权限?
更新
我已尝试使用os.chmod
和os.fchmod
,正如迈克所建议的那样,但这需要一个路径名(我没有)或给出错误(对于{{1} }):
fchmod
我想,一个选项是首先保存zip文件,设置权限,然后允许下载,但这似乎有点矫枉过正 - 必须有更好的方法来克服这个简单的问题。有人有任何建议或想法吗?
UPDATE2
似乎这个问题仅限于Unix系统,因为它在Windows和(显然)OS X中运行良好。我找到了一个类似的线程here。据我所知,它必须与ZipFile instance has no attribute '__trunc__'
方法相关。如何使用writestr
设置添加到zip文件的文件的权限?
答案 0 :(得分:4)
我认为无论您使用什么来提取zip都存在问题。权限对我来说似乎很好:
zk@fool:~/Downloads% ls -l | grep thefile
-rwxr-xr-x@ 1 zk staff 9 May 3 06:37 thefile.txt*
在osx和window的内置zip浏览器和7-zip上使用Archive Utility正常工作。检查生成的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 :(得分:0)
在unix中,每个进程都有默认的文件权限掩码。继续阅读:
umask的
尝试为django进程设置它。