4

我让 Nginx 为我在 Gunicorn 上运行的静态 Django 文件提供服务。我正在尝试提供 MP3 文件并让它们具有头部 206,以便它们将被 Apple 接受用于播客。目前,音频文件位于我的静态目录中,并直接通过 Nginx 提供。这是我得到的回应:

    HTTP/1.1 200 OK
    Server: nginx/1.2.1
    Date: Wed, 30 Jan 2013 07:12:36 GMT
    Content-Type: audio/mpeg
    Content-Length: 22094968
    Connection: keep-alive
    Last-Modified: Wed, 30 Jan 2013 05:43:57 GMT

有人可以帮助以正确的方式提供 mp3 文件,以便接受字节范围。

更新:这是我认为通过 Django 提供文件的代码

    response = HttpResponse(file.read(), mimetype=mimetype)
    response["Content-Disposition"]= "filename=%s" % os.path.split(s)[1]
    response["Accept-Ranges"]="bytes"
    response.status_code = 206
    return response
4

3 回答 3

2

如果您只想在负责提供静态 .mp3 文件的指令中执行此操作,请添加这些指令nginxlocation

# here you add response header "Content-Disposition"
# with value of "filename=" + name of file (in variable $request_uri),
# so for url example.com/static/audio/blahblah.mp3 
# it will be /static/audio/blahblah.mp3
# ----
set $sent_http_content_disposition filename=$request_uri;
    # or
add_header content_disposition filename=$request_uri;

# here you add header "Accept-Ranges"
set $sent_http_accept_ranges bytes;
# or
add_header accept_ranges bytes;

# tell nginx that final HTTP Status Code should be 206 not 200
return 206;
于 2013-01-30T20:09:10.840 回答
1

您的配置中有一些东西阻止 nginx 支持对这些静态文件的范围请求。使用标准 nginx 模块时,这可能是以下过滤器之一(这些过滤器修改响应,如果在请求正文处理期间可能发生修改,则禁用字节范围处理):

所有这些模块都有指令来控制它们使用的 MIME 类型 ( gzip_types, gunzip_types, addition_types, ssi_types)。默认情况下,它们设置为限制性的 MIME 类型集,即使启用了这些模块,范围请求也适用于大多数静态文件。但是放置类似的东西

ssi on;
ssi_types *;

进入配置将禁用对所有受影响的静态文件的字节范围支持。

检查您的 nginx 配置并删除有问题的行,和/或确保关闭有问题的模块以获取您提供 mp3 文件的位置。

于 2014-06-27T19:18:31.723 回答
0

您可以定义自己的状态码:

response = HttpResponse('this is my response data')
response.status_code = 206
return response

如果你使用的是 Django 1.5,你可能想看看新的 StreamingHttpResponse:

https://docs.djangoproject.com/en/dev/ref/request-response/#streaminghttpresponse-objects

这对于大文件非常有帮助。

于 2013-01-30T13:27:05.260 回答