【问题标题】:How to allow users to directly download a file stored in my media folder in django?如何允许用户直接下载存储在 django 中我的媒体文件夹中的文件?
【发布时间】:2020-08-04 16:13:34
【问题描述】:

所以我正在使用 Django 为“开发平台”项目构建一个 RESTful API,并希望设置一个上传/下载功能,平台用户可以上传各种文件(Excel 文件、css 文件、pdf 文件、C#脚本、统一包、blender 文件等)和其他用户然后可以通过端点下载这些文件。我已配置上传文件端点并正常工作。

在下载文件端点,我想接收用户想要下载的文件名,并验证用户下载该文件的凭据和权限,并执行一些其他模型查询和检查,最后在我的 / 中找到该文件media/ 文件夹并将其提供给用户的浏览器以进行自动下载或在浏览器上弹出下载。 (当用户按下前端的“下载文件”按钮时,此下载文件端点会被命中)。

如何在 django 中实现这一点?有人可以提供一段示例代码来“发送”该文件,一旦从媒体文件夹中获取,作为对用户浏览器下载的响应?

【问题讨论】:

    标签: python django django-rest-framework django-authentication django-file-upload


    【解决方案1】:

    您可以编写如下所示的下载函数。

    def download(request,file_name):
      file_path = settings.MEDIA_ROOT +'/'+ file_name
      file_wrapper = FileWrapper(file(file_path,'rb'))
      file_mimetype = mimetypes.guess_type(file_path)
      response = HttpResponse(file_wrapper, content_type=file_mimetype )
      response['X-Sendfile'] = file_path
      response['Content-Length'] = os.stat(file_path).st_size
      response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name) 
    
      return response
    

    基本上你必须设置 X-Sendfile、Content-Disposition、Content-Length,这些都很重要。 在前端你可以这样:<a href="{file_path}" download></a>

    您还可以查看以下链接,这可能会帮助您获得答案。

    Django download a file

    Downloading the files(which are uploaded) from media folder in django 1.4.3

    https://ednsquare.com/question/how-to-serve-downloadable-files-using-django------9lAMsr

    【讨论】:

    • 感谢您的回答!我做了所有这一切,并在端点上得到了 200,这表明它工作正常。我还检查了响应标头,它显示了文件名和内容长度。但是没有在浏览器上开始下载。我也没有弹出下载。你能帮忙吗?我还需要在前端做些什么吗? PS。我在本地机器上测试,而不是在服务器上。
    • 是的,在前端你必须像 让它工作
    • 我是否必须返回一个包含所有这些标头的 HttpResponse,并且我必须在前端创建一个下载链接?假设在前端我已经有了文件的完整路径?
    猜你喜欢
    • 2019-04-06
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2020-07-24
    相关资源
    最近更新 更多