2014-07-30 3 views
0

Я загрузил файлы в mongo. Но когда я хочу скачать с mongo по httpresonse в веб-браузере, это не сработало.скачать файл из mongo gridfs с помощью python

Вот views.py:

if filename is not None: 
    file_ = db.fs.files.find_one({ 
    'filename':filename 
     }) 
    file_id = file_['_id'] 
    wrapper = fs.get(file_id).read() 

    response = StreamingHttpResponse(FileWrapper(wrapper),content_type=file_['contentType']) 

    response['Content-Disposition'] = 'attachment; filename=%s' % str(filename) 
    response['Content-Length']  = file_['length'] 
    return response 

Я получил эту ошибку:

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 126, in finish_response 
for data in self.result: 
File "/usr/local/lib/python2.7/dist-packages/django/utils/six.py", line 473, in next 
return type(self).__next__(self) 
File "/usr/local/lib/python2.7/dist-packages/django/http/response.py", line 292, in __next__ 
return self.make_bytes(next(self._iterator)) 
File "/usr/lib/python2.7/wsgiref/util.py", line 30, in next 
data = self.filelike.read(self.blksize) 
AttributeError: 'str' object has no attribute 'read' 

Но когда я изменить StreamingHttpResponse к HttpResponse, ошибка состоит в следующем:

[30/Jul/2014 17:29:43] "GET /download/cs101/ HTTP/1.1" 200 664 
/usr/lib/python2.7/wsgiref/handlers.py:126: DeprecationWarning: 
Creating streaming  responses with `HttpResponse` is deprecated. 
Use `StreamingHttpResponse`instead if you need the streaming behavior. 
for data in self.result: 

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 126, in finish_response 
for data in self.result: 
File "/usr/local/lib/python2.7/dist-packages/django/utils/six.py", line 473, in next 
return type(self).__next__(self) 
File "/usr/local/lib/python2.7/dist-packages/django/http/response.py", line 292, in __next__ 
return self.make_bytes(next(self._iterator)) 
File "/usr/lib/python2.7/wsgiref/util.py", line 30, in next 
data = self.filelike.read(self.blksize) 
AttributeError: 'str' object has no attribute 'read' 

Заранее спасибо!

ответ

1

Вы называете метод read в:

wrapper = fs.get(file_id).read() 

Так вы получаете str (предполагая, что Python 2, если 3, вы получаете bytes). FileWrapper нужен файл как объект, который, конечно, str не один.

Попробуйте использовать:

wrapper = fs.get(file_id) 

Это возвратит файл как объект.

Ото, PyMongo-х .get() возвращает экземпляр GridOut, который уже поддерживает iteration, так почему бы не попробовать что-то вроде:

wrapper = fs.get(file_id) 
response = StreamingHttpResponse(wrapper, content_type=file_['contentType']) 
+0

Thanks.I будет попробовать. – Arthur

Смежные вопросы