Потоковая передача файлов в mongodb gridfs

Я пытаюсь загрузить видео файлы в gridfs, используя django + mongoengine на сервере.

Сторона клиента: ( JavaScript для чтения / фрагментации файла и отправки данных на сервер с помощью ajax. )

_upload : function() { chunk = self.file.slice( self.start, self.end ); reader = new FileReader(); reader.readAsDataURL( chunk ); reader.onload = function(e) { this.request = new XMLHttpRequest(); this.request.open( 'POST', '/ajax/video_upload/' ); this.request.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); this.request.overrideMimeType('application/octet-stream'); this.request.send( JSON.stringify({ 'chunk': e.target.result, 'id' : self.file_id }) ); this.request.onload = function() { if( self.start >= self.file_size && self.preventedOverflow ) { return; } self.start = self.end; self.end = self.end + self.chunkSize; self._upload(); }; } 

Сторона сервера:

 def uploadVideo(request): if request.body and request.is_ajax: data = json.loads(request.body) m = Multimedia.objects.get( id = data['id'] ) m.media.new_file() m.media.write( data['chunk'] ) m.media.close() m.save() return HttpResponse() 

Ошибка:

 ERROR:django.request:Internal Server Error: /ajax/video_upload/ Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 115, in get_response response = callback(request, *callback_args, **callback_kwargs) File "/home/praveen/Desktop/gatherify/gatherify/../ajax/views.py", line 33, in uploadVideo m.media.write( data['chunk'] ) File "/usr/local/lib/python2.7/dist-packages/mongoengine-0.8.7-py2.7.egg/mongoengine/fields.py", line 1172, in write self.newfile.write(string) File "build/bdist.linux-i686/egg/gridfs/grid_file.py", line 327, in write "order to write %s" % (text_type.__name__,)) TypeError: must specify an encoding for file in order to write unicode 

Я понятия не имею, как указать кодировку, в официальной документации ничего не говорится об этом. ( http://mongoengine-odm.readthedocs.org/guide/gridfs.html )

Другая проблема заключается в том, что когда я пытаюсь записать следующие фрагменты в следующем ajax-запросе, я получаю сообщение об ошибке:

 GridFSError: This document already has a file. Either delete it or call replace to overwrite it 

Любая помощь приветствуется. Благодаря 🙂

2 Solutions collect form web for “Потоковая передача файлов в mongodb gridfs”

Кодируйте строку data['chunk'] перед тем, как записать ее в FileField.

 m.media.new_file() m.media.write( data['chunk'].encode("UTF-8") ) m.media.close() 

Что касается вашего второго вопроса, вы уже создали файл в gridfs. Как и сообщение об ошибке, вы добрались до m.media.delete() или m.media.replace(<a new gridfs entry>) . Если вы хотите добавить его, вам, вероятно, m.media.get() содержимое файла в виде строки, добавьте новый кусок в строку, а затем создайте новый файл m.media gridfs. Вы не можете напрямую редактировать содержимое gridfs.

  1. вам нужно записать данные в utf-8
  2. вам не следует закрывать экземпляр GridOut, полученный из нового файла после того, как вы написали только первый фрагмент
  3. вы должны создать зелень для каждой загрузки нового файла
  4. выход после написания куска
  5. отправьте ack, чтобы получить следующий фрагмент, а также некоторый «идентификатор», чтобы идентифицировать родословную.
  6. проснитесь зеленью и отправьте новый кусок
  7. отправьте «конец файла», как только никакие куски не будут оставлены
  8. Теперь закройте GridOut.
  9. выйти из зеленой
  • Различие XGBoost в тренировочных и тестовых функциях после преобразования в DMatrix
  • Как проверить наличие ключа значения (как определено в одном dict) в другом dict, в Python?
  • Загрузка большего содержимого на веб-страницу и проблемы с записью в файл
  • Проверка кода для предупреждений об устаревании
  • Импорт ведет себя по-другому, когда в __init__.py импортируется
  • Сравнение двух списков и печать только различий? (XORing два списка)
  • Как подключить функцию страницы к следующей кнопке qwizard?
  • Почему «выживают» после.
  • Запуск макроса Excel через Python?
  • Лучший способ включения сторонних зависимостей в приложение Python
  • TypeError: объект 'int' не повторяется - Python
  • Python - лучший язык программирования в мире.