gpt4 book ai didi

Django将文件上传到取决于POST URI的特定目录

转载 作者:行者123 更新时间:2023-12-04 03:35:05 26 4
gpt4 key购买 nike

我想将上传的文件存储到取决于 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 之外:
  • 延长 TemporaryUploadedFile并覆盖 初始化 () 通过不同的目录传递给 NamedTemporaryFile。除了上面显示的 pass 之外,它可以使用 try mkdir。
  • 延长 TemporaryFileUploadHandler并覆盖 new_file() 以使用上述类。
  • 也延长 初始化 () 接受您希望文件夹所在的目录。
  • 动态添加请求处理程序,通过从 URL 确定的目录:

    request.upload_handlers = [ProgressBarUploadHandler(request.path.replace('/', '_')]

  • 虽然很重要,但它仍然比从头开始编写处理程序更容易:特别是,您不必编写一行容易出错的缓冲读取。第 3 步和第 4 步是必要的,因为 FileUploadHandlers 默认不传递请求信息,我相信,所以如果你想以某种方式使用 URL,你必须单独告诉它。

    我真的不建议为此编写自定义 FileUploadHandler。这真的是混合了不同的责任层。相对于通过互联网上传文件的速度,进行本地文件复制是微不足道的。如果文件很小,Django 只会将其保存在内存中,而不会将其写入临时文件。我有一种不好的感觉,你会得到所有这些工作,并发现你甚至无法衡量性能差异。

    关于Django将文件上传到取决于POST URI的特定目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2277281/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com