Django:从mongodb中的GridFS下载文件

时间:2014-02-03 07:31:45

标签: python django mongodb download gridfs

我试图从MongoDB中的GridFS中获取一个文件,并允许用户使用Django下载zip存档。

我的views.py文件中的函数如下所示:

def GetFile(request, md5):
    try:
        fs = gridfs.GridFS(db)

        f = db.fs.files.find_one({"md5": md5})

        if f:
            fileID = f['_id']
            filename = f['filename']

            if fileID:
                doc = db.fs.chunks.find_one({"files_id": fileID})

                if doc:
                    data = doc['data']
                    myFile = cStringIO.StringIO(data)
                    response = HttpResponse(FileWrapper(myFile), content_type = 'application/zip')
                    response['Content-Transfer-Encoding'] = 'Binary'
                    response['Content-Disposition'] = "attachment; filename=%s" % filename

    except:
        response = "It didn't work!"

return HttpResponse(response)

每当我调用此函数时(我在终端中使用urllib2.openurl()通过GET请求这样做),它会将文件的内容输出到终端上。但是,我希望它允许我下载包含此文件的zip存档。

我一直在看很多例子,但我无法弄清楚我哪里出错了。

提前感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

关于向客户发送文件,请检查Serving large files ( with high loads ) in Django。此外,您似乎通过执行find_one直接从块集合中读取,这不是使用存储在GridFS上的文件的适当方法。理想情况下,您可以使用gridfs文件io api:

访问它
response = HttpResponse(FileWrapper(fs.get_version(filename)), content_type = 'application/zip')
response['Content-Transfer-Encoding'] = 'Binary'

如果一切成功而不是在HttpReponse中再次换行,你可能想直接在try块中返回响应。