- 尝试加载大于72 MB的视频时管道损坏

时间:2016-06-20 13:24:01

标签: django django-rest-framework

我有一个方法:

startLesson: function(lesson) {
  var scope = this;

  scope.getLessonDataFromFile(lesson.id).then(function (data) {
    scope.mode = 'LESSON';
    scope.lesson.name = lesson.filename;
    scope.lesson.task = data;
    scope.lesson.taskHash = hash(JSON.stringify(scope.lesson.task));
    scope.lesson.flags = [];
    scope.lesson.score = [];
    scope.lesson.visibleDescriptions = [];
    scope.lesson.visibleDescriptionActions = [];
    scope.lesson.editMode = false;
    scope.lesson.analysisMode = false;
    scope.lesson.totalScore = 0;
    scope.lesson.maxScore = scope.lesson.task.timeslots.length * 15;
    $("#video")[0].load();
    $("#video")[0].addEventListener("canplay", scope.updateDurationOnCanplay, false);
 });

当此代码尝试下载视频时(我尚未确定确切的值,但它在33-72 MB范围内某处)大于某个值的大小,会发生以下情况:

[20/Jun/2016 15:24:18] "GET /lessons/api/lessons/01 HTTP/1.1" 200 6760
[20/Jun/2016 15:24:19] "GET /media/video/01.mp4 HTTP/1.1" 200 190267623
[20/Jun/2016 15:24:19] "GET /media/video/01.mp4 HTTP/1.1" 200 688128
Traceback (most recent call last):
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run
    self.finish_response()
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 128, in finish_response
    self.write(data)
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 217, in write
    self._write(data)
  File "/usr/lib/python2.7/socket.py", line 328, in write
    self.flush()
  File "/usr/lib/python2.7/socket.py", line 307, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 104] Connection reset by peer
[20/Jun/2016 15:24:19] "GET /media/video/01.mp4 HTTP/1.1" 500 59
- Broken pipe from ('127.0.0.1', 44686)

我的API:

@staticmethod
def get(request, lesson_name):
    data_file_path = os.path.join(VIDEO_ROOT, lesson_name + '.json')
    data = {}
    try:
        with open(data_file_path, 'r') as data_file:
            data = json.load(data_file)
    except IOError:
        data['timeslots'] = []
    data['id'] = lesson_name
    data['filename'] = os.path.join(settings.MEDIA_URL, 'video', lesson_name + '.mp4')

    return Response(data)

这种奇怪错误可能是什么原因?

1 个答案:

答案 0 :(得分:2)

对于大型文件,您应该使用Django' StreamingHttpResponse

import os
import mimetypes
from wsgiref.util import FileWrapper
from django.http import StreamingHttpResponse


def get(request, lesson_name):

    video_path = 'path_to_file'

    wrapper FileWrapper(open(video_path))
    response = StreamingHttpResponse(wrapper, content_type=mimetypes.guess_type(video_path)[0])
    response['Content-Length'] = os.path.getsize(video_path)

但是 - 您可能还需要对网络服务器配置进行一些调整。你在使用Apache2还是nginx?和应用程序服务器在使用。 Gunicorn? Django uWSGI?