2017-02-16 3 views
3

Я пытаюсь загрузить удаленно (т. Е. Через браузер) Mongo dump с сервера с помощью команды mongodump.Загрузка архива, созданного с помощью 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

Смежные вопросы