在使用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月