基于Flask(Python Web)从MognoDB GridFS下载文件实践代码

在使用MognoDB GridFS进行文件管理Web应用服务中,可以通过Web服务直接从MognoDB GridFS数据库中,把文件二进制以数据流方式,直接下载读取到浏览器中,供在线浏览和下载使用。

当前Chrome、Microsoft Edge等浏览器可以直接在浏览器中,直接在线浏览PDF、图片等文件。

实践程序结构如下所示:
1、前端网页,部署到Apache HTTP或Ngix服务上,提供web服务。


<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”。读取文件,效果如下:
基于Flask(Python Web)从MognoDB GridFS下载文件实践代码_第1张图片

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)参考数据库情况结构及内容
基于Flask(Python Web)从MognoDB GridFS下载文件实践代码_第2张图片

参考:
《基于Python使用MongoDB及其GridFS进行文档管理》 CSDN博客 肖永威 2019年9月
《优化文件下载性能,缓存MongoDB GRIDFS文件(实践讨论稿)》 CSDN博客 肖永威 2016年10月

你可能感兴趣的:(人工智能及Python)