基於Flask(Python Web)從MognoDB GridFS下載文件實踐代碼

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章