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

标签 django upload directory storage filenames

我想将上传的文件存储到取决于 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/

    相关文章:

    Django 应用程序因几个并发请求而卡住

    python - django-oauth-工具包 : Customize authenticate response

    php - 无需 https(ssl 层)的安全文件上传

    java - 在Java Struts 2中使用ajax/jquery将图像上传到服务器后,如何自动将图像加载到<div>中而不刷新页面?

    java - JFileChooser 不允许选择目录

    database - 如何在 Google App Engine/Django-nonrel 中存储一长串数字?

    css - 为什么更改 CSS 类名会破坏样式?

    iphone - iOS 应用程序 : Uploading multiple files in the background

    Ruby:Dir.chdir 在 Windows 中使用文本文件中的数据

    Java - 如何更改文件夹的图标