我想将上传的文件存储到取决于 POST 请求的 URI 的特定目录中。也许,我还想将文件重命名为固定的名称(例如文件输入的名称),这样我就有了一种简单的方法来 grep 文件系统等,并避免可能出现的安全问题。
在 Django 中执行此操作的首选方法是什么?
编辑:我应该澄清一下,我可能有兴趣将其作为文件上传处理程序执行,以避免将大文件两次写入文件系统。
Edit2:我想可以将 tmp 文件“mv”到一个新位置。如果在同一个文件系统上,这是一个廉价的操作。
最佳答案
Django 使您可以完全控制保存文件的位置(以及是否)。见:http://docs.djangoproject.com/en/dev/topics/http/file-uploads/
下面的例子展示了如何结合 URL 和上传文件的名称并将文件写出到磁盘:
def upload(request):
folder = request.path.replace("/", "_")
uploaded_filename = request.FILES['file'].name
# create the folder if it doesn't exist.
try:
os.mkdir(os.path.join(BASE_PATH, folder))
except:
pass
# save the uploaded file inside that folder.
full_filename = os.path.join(BASE_PATH, folder, uploaded_filename)
fout = open(full_filename, 'wb+')
# Iterate through the chunks.
for chunk in fout.chunks():
fout.write(chunk)
fout.close()
编辑:如何使用 FileUploadHandler 做到这一点?它追溯了代码,似乎您需要做四件事来重新调整 TemporaryFileUploadHandler 的用途以保存在 FILE_UPLOAD_TEMP_DIR 之外:
request.upload_handlers = [ProgressBarUploadHandler(request.path.replace('/', '_')]
虽然很重要,但它仍然比从头开始编写处理程序更容易:特别是,您不必编写一行容易出错的缓冲读取。第 3 步和第 4 步是必要的,因为 FileUploadHandlers 默认不传递请求信息,我相信,所以如果你想以某种方式使用 URL,你必须单独告诉它。
我真的不建议为此编写自定义 FileUploadHandler。这真的是混合了不同的责任层。相对于通过互联网上传文件的速度,进行本地文件复制是微不足道的。如果文件很小,Django 只会将其保存在内存中,而不会将其写入临时文件。我有一种不好的感觉,你会得到所有这些工作,并发现你甚至无法衡量性能差异。
关于Django将文件上传到取决于POST URI的特定目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2277281/