【问题标题】:Setting correct permissions on generated zip-file in Django在 Django 中对生成的 zip 文件设置正确的权限
【发布时间】:2011-08-16 10:11:59
【问题描述】:

我正在使用 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,我的网站用户也不是。

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

更新

按照 Mike 的建议,我已尝试使用 os.chmodos.fchmod,但这要么需要路径名(我没有),要么会报错(fchmod):

ZipFile instance has no attribute '__trunc__'

我想,一个选项是先保存 zip 文件,设置权限,然后允许下载,但这似乎有点矫枉过正——必须有更好的方法来解决这个简单的问题。有人有什么建议或想法吗?

更新2

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

【问题讨论】:

  • 哪个文件的权限错误:下载的ZIP文件还是压缩文件中的文本文件?
  • @Mike DeSimone:zip 文件中的文本文件。
  • @vartec:是的,这似乎是我问题的根源。响应下载为 zip 文件,但内容权限错误,我无法设置权限,因为没有要设置的文件(还)。
  • @vartec:最后,是的。但很长一段时间以来,我一直认为这个问题与我在 Django 中返回 zip 文件作为响应有关 - 所以也许有一天其他使用 Django 的人可能会做出同样的错误假设,然后这会有所帮助。

标签: python django permissions zip


【解决方案1】:

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

zk@fool:~/Downloads% ls -l | grep thefile
-rwxr-xr-x@  1 zk  staff           9 May  3 06:37 thefile.txt*

使用 osx 上的存档实用程序和 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*

【讨论】:

  • 是的,根据this thread,在我看来问题仅限于 Unix 系统。
  • 也许尝试设置 ZipInfo.external_attr 或 internal_attr?
  • @zeekay:啊,是的,我只是在看到另一个帖子后检查了自己,这解决了问题。
  • @zeekay:但必须是zipInfo.external_attr = 0777 &lt;&lt; 16L
  • 是的,确实应该记录在案:docs.python.org/release/2.7/library/…
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2013-11-30
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多