Запретить браузерам открывать файлы json и вместо этого загружать их при отправке из приложения flask - PullRequest
0 голосов
/ 06 августа 2020

У меня есть файл JSON в приложении flask, который я отправляю через send_from_directory () или через send_file (), я пробовал оба. Это срабатывает при нажатии кнопки, но браузер открывает файл напрямую, а не в диалоговом окне загрузки. Я немного исследовал и обнаружил, что Firefox и Chrome имеют встроенную опцию для этого, однако я хочу, чтобы он всегда загружался, а не открывался, независимо от настроек в браузере.

Flask Код

def download_file():
    filename = "requiredFields.json"

    return send_from_directory(app.config['MAIN_FOLDER'],filename,as_attachment=True)

HTML Это вызывает

<a href="{{url_for('download_file',filename = file)}}"class="btn btn-primary" type="button">Download</a>

1 Ответ

0 голосов
/ 06 августа 2020

Если вы установите mimetype на 'application/octet-stream', тогда браузер должен его сохранить.

send_file(..., mimetype='application/octet-stream')

send_from_directory(..., mimetype='application/octet-stream')

Do c: send_file

См. Также: Нужен ли Content-Type: application / octet-stream для загрузки файла?

РЕДАКТИРОВАТЬ:

Минимальный рабочий пример - вам нужно только установить правильные имена файлов в index()

Неважно, есть ли у вас файл .json , .txt, изображение, .pdf или другое. Работает для всех типов файлов.

from flask import Flask, render_template_string, send_from_directory

app = Flask(__name__)
app.config['MAIN_FOLDER'] = '.'

@app.route('/')
def index():
    all_filenames = [
        'requiredFields.json',
        'input.txt',
        'image.jpg',
        'document.pdf',
    ]
    
    return render_template_string('''
{% for file in all_files %}
    <a href="{{ url_for('download_file', filename=file) }}">Download {{file}}</a><br/>
{% endfor %}''', all_files=all_filenames)

#@app.route('/download_file/<filename>')
@app.route('/download_file/<path:filename>')
def download_file(filename):
    return send_from_directory(app.config['MAIN_FOLDER'], filename, as_attachment=True, attachment_filename=filename, mimetype='application/octet-stream')
    
if __name__ == '__main__':    
    app.run() #debug=True 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...