在使用MognoDB GridFS进行文件管理Web应用服务中,可以通过Web服务直接从MognoDB GridFS数据库中,把文件二进制以数据流方式,直接下载读取到浏览器中,供在线浏览和下载使用。
当前Chrome、Microsoft Edge等浏览器可以直接在浏览器中,直接在线浏览PDF、图片等文件。
实践程序结构如下所示:
1、前端网页,部署到Apache HTTP或Ngix服务上,提供web服务。
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body >
<form action="http://localhost:5000/filemanage/readfile" method="get">
<input type="text" name="fileName" /><input type="submit" value="读文件" />
</form>
</body>
</html>
本文使用Apache HTTP,把此文件部署到DocumentRoot目录下,在浏览器上打开:http://localhost/fs_download.html
输入:“石油信息智能分析系统.pdf”。读取文件,效果如下:
2、后端Flask提供Restful服务。
(1)FileManagerGridFS为基于GridFS到文件管理类,提供文件上传数据库、从数据库下载功能,详见如下代码:
'''
Created on 2019年9月5日
@author: xiaoyw
'''
import pymongo
from gridfs import GridFS
from bson.objectid import ObjectId
import os
class FileMangerGridFS(object):
UploadCache = "uploadcache"
dbURL = "mongodb://localhost:27017"
def __init__(self, params):
'''
Constructor
'''
self.dbURL = params
# 按文件名获取文档
def downLoadFile(self,file_coll,file_name,out_name,ver):
client = pymongo.MongoClient(self.dbURL)
db = client["store"]
gridfs_col = GridFS(db, collection=file_coll)
file_data = gridfs_col.get_version(filename=file_name, version=ver).read()
with open(out_name, 'wb') as file_w:
file_w.write(file_data)
# 返回文件数据流
def dowLoadFileData(self,file_coll,file_name,ver):
client = pymongo.MongoClient(self.dbURL)
db = client["store"]
gridfs_col = GridFS(db, collection=file_coll)
print(file_name)
file_data = gridfs_col.get_version(filename=file_name, version=ver).read()
return file_data
(2)通过Flask提供Web接口服务,接口标准为Restful,实现文件下载和上传功能。
注:本文只提供文件下载到浏览器预览功能。
'''
Created on 2019年9月9日
@author: xiaoyw
'''
from flask import Flask, request, Response
from FileManager import MongoGridFS
app = Flask(__name__)
@app.route('/filemanage/readfile', methods=['GET'])
def readfile():
fullfilename = request.args.get('fileName')
print(fullfilename)
fs = MongoGridFS.FileMangerGridFS("mongodb://localhost:27017")
filedata = fs.dowLoadFileData("pdf", fullfilename, 0)
response = Response(filedata,content_type='application/pdf')
#application/octet-stream
#response.headers["Content-disposition"] = 'attachment; filename=%s' % fullfilename
return response
if __name__ == '__main__':
app.run(debug=True)
(3)参考数据库情况结构及内容
参考:
《基于Python使用MongoDB及其GridFS进行文档管理》 CSDN博客 肖永威 2019年9月
《优化文件下载性能,缓存MongoDB GRIDFS文件(实践讨论稿)》 CSDN博客 肖永威 2016年10月