保存和检索MongoDB中的Blob数据

时间:2014-08-09 22:46:26

标签: python django mongodb

我正在尝试使用django_mongodb_engine在mongodb集合中保存文件这么简单,但我遇到了很多困难。

到目前为止,我只能通过将文件保存到数据库之前将文件转换为base64,然后在检索它时从base64解码它来使其工作。我不希望这样做,因为来回转换为base64可能会占用比此操作实际占用更多的资源,尽管我可能错了。

那么有人能告诉我使用django_mongodb_engine从MongoDB保存和检索二进制数据的正确方法吗?

到目前为止

代码:

models.py

from django.db import models
from djangotoolbox.fields import *

class TestModel(models.Model):
    name = models.CharField(max_length=50)
    zip_file = BlobField()

views.py

from django.shortcuts import render
from django.http import HttpResponse
from my_project.models import *

def index(request):
    f = open('myfile.zip')
    contents = f.read()
    f.close()

    record = TestModel.objects.create(
        name = "My File",
        zip_file = contents
    )

    result = TestModel.objects.filter(name = "My File")

    zip_contents = result[0].zip_file

    response = HttpResponse(zip_contents, content_type='application/zip')
    response['Content-Disposition'] = 'attachment; filename="My_File.zip"'
    return response

哦,请不要告诉我使用GridFS,因为我将存储的文件将低于16MB,大约2.5MB - 最多3.5MB。

1 个答案:

答案 0 :(得分:0)

正如NeilLunn指出的那样,django_mongodb_engine不支持二进制数据字段,最好完全使用mongoengine的ORM。

我的工作代码:

models.py

from mongoengine import *

class TestModel(Document):
    name = StringField(max_length=50)
    zip_file = BinaryField()

views.py

from django.http import HttpResponse
from my_project.models import *

def index(request):
    f = open('myfile.zip')
    contents = f.read()
    f.close()

    record = TestModel(name = 'My File', zip_file = contents)
    record.save()

    result = SkinDetails.objects(name='Metro Skin')

    zip_contents = result[0].zip_file

    response = HttpResponse(zip_contents, content_type='application/zip')
    response['Content-Disposition'] = 'attachment; filename="My_File.zip"'
    return response