【发布时间】:2011-01-23 10:26:27
【问题描述】:
我一直在尝试找出使用 Turbogears 2 管理文件上传的“最佳实践”方法,但到目前为止还没有真正找到任何示例。我已经找到了一种实际上传文件的方法,但我不确定它的可靠性。
另外,获取上传文件名的好方法是什么?
file = request.POST['file']
permanent_file = open(os.path.join(asset_dirname,
file.filename.lstrip(os.sep)), 'w')
shutil.copyfileobj(file.file, permanent_file)
file.file.close()
this_file = self.request.params["file"].filename
permanent_file.close()
所以假设我理解正确,这样的事情会避免核心“命名”问题吗? id = UUID。
file = request.POST['file']
permanent_file = open(os.path.join(asset_dirname,
id.lstrip(os.sep)), 'w')
shutil.copyfileobj(file.file, permanent_file)
file.file.close()
this_file = file.filename
permanent_file.close()
【问题讨论】:
-
是的,使用
uuid1().hex或uuid4().hex将解决命名问题和大多数安全问题。您不需要在 uuid 上调用lstrip()(不要使用id作为变量名 - 它会掩盖内置的id())。因此,使用uuid生成一个唯一名称并将上传的数据复制到上传目录中该名称的文件中。如果您需要存储用户提供的文件名,请将其保存为元数据,也许在您的数据库中。您将面临其他安全问题,此处描述了其中几个问题:scanit.be/uploads/php-file-upload.pdf -
好的,感谢您的帮助 mhawke。伟大的阅读。出于好奇,是否有任何真正的理由使用 uuid4().hex 而不是 uuid4()?前者生成了一个稍微更人性化的 UUID,用于 URL 等。 (我正在考虑生成两个 UUID,一个用于下载 URL,另一个用于实际文件名/ID。
-
除了文件名的长度之外,
uuid4().hex与str(uuid4())或多或少是相同的。我认为为 URL 和文件名使用独立的 UUID 没有任何优势,因为您现在需要一个额外的层来将 URL 中的 UUID 映射到实际文件。
标签: python turbogears2