2017-02-16 54 views
3

我試圖使用mongodump命令從服務器遠程(即通過瀏覽器)下載Mongo轉儲。下載使用mongodump創建的存檔

後端是一個瓶服務器是這樣的:

@api.route('/export', methods=['GET']) 
def exportDb(): 
    subprocess.check_output(['mongodump','--archive=db.gz', '--gzip', '--db', 'my_db']) 
    response = make_response(open('db.gz', 'r').read()) 
    response.headers["Content-Disposition"] = "attachment; filename=db.gz" 
    return response 

的前端使用AngularJs,看起來像這樣:

$http({ 
     method: 'GET', 
     url: '/intro/export' 
    }).then(function(response) { 
     var blob = new Blob([response.data], {type: 'application/zip, application/octet-stream'}); 
     var objectUrl = URL.createObjectURL(blob); 
     window.open(objectUrl); 
    } 

歸檔正確創建在服務器端,但我無法將其發送到客戶端。發送請求時,會打開一個新選項卡,用於下載以guid命名的文件,因此不能使用「db.gz」,並且該文件不能用任何存檔客戶端打開,因此我發送它時一定錯過了某些內容,或者保存它。

任何幫助將非常感激。

+1

我認爲這裏的問題是你使用'open('db.gz','r')。read()'在文本模式下讀取你的GZ(默認),你應該在二進制文件中讀取它以保存數據。因此,不要用'r'在你的原始代碼上使用'rb',看看它是否有效。下面是一個「open」標誌表:https://docs.python.org/3/library/functions.html#open –

回答

2

所以我已經做了這樣的:

@api.route('/exportDB', methods=['GET']) 
def exportDB(): 
    subprocess.check_output(['mongodump','--archive=db.gz', '--gzip', '--db', 'my_db']) 
    response = send_from_directory("path/to/folder", 'db.gz', as_attachment=True) 
    response.headers["Content-Type"] = "application/javascript" 
    return response 

在客戶端,我有:

$http({ 
    method: 'GET', 
    url: '/intro/exportDB', 
    responseType: 'blob' 
}).then(function(response) { 
    var data = new Blob([response.data]); 
    saveAs(data, "db.gz"); 
} 

其中的saveAs是Filesaver.js從here