I
I
inalan2020-09-07 03:50:38
Flask
inalan, 2020-09-07 03:50:38

How to download file from path - Flask?

In my application, I made sure that the files themselves are loaded into a directory and the path to these directories is stored in the database. Now I can't add a function that downloads files directly from directory
here is my code:

app.config['UPLOAD_FOLDER'] = '/Users/a10.12/PycharmProjects/QuestionAnswer/debugger/static/files'

def save_file(form_file):
    random_hex = secrets.token_hex(8)
    _, f_ext = os.path.splitext(form_file.filename)
    picture_fn = random_hex + f_ext
    picture_path = os.path.join(app.root_path, 'static/files', picture_fn)
    form_file.save(picture_path)
    return picture_fn

@app.route('/ticket/<int:ticket_id>',methods=['GET','POST'])
@login_required
def ticket(ticket_id):
    ticket = Tickets.query.get_or_404(ticket_id)
    com = Comment.query.filter_by(ticket_id=ticket.id).first()
    form = CommentForm()
    attachform = AttachForm()
    if form.validate_on_submit() and form.body.data:
        comment = Comment(body=form.body.data,ticket_id=ticket_id,author = current_user.username)
        db.session.add(comment)
        db.session.commit()
        flash('Your comment has been published.')
        return redirect(url_for('ticket', ticket_id=ticket_id))
    if attachform.validate_on_submit():
        if attachform.file.data:
            picture_file = save_file(attachform.file.data)
            attachment = Attachment(file=picture_file,ticket_id=ticket_id)
            db.session.add(attachment)
        db.session.commit()
        flash('Your file has been published.')
        return redirect(url_for('ticket', ticket_id=ticket_id))
    file = url_for('static', filename='files/' + str(ticket.attach))
    return render_template('ticket.html', title=ticket.title,file=file ,ticket=ticket,form=form,comment=com,attachform=attachform)


and here is what I tried to create in order to download the file
@app.route('/uploads/<path:filename>', methods=['GET', 'POST'])
def download(filename):
    uploads = os.path.join(app.root_path, app.config['UPLOAD_FOLDER'])
    return send_from_directory(directory=uploads, filename=filename, as_attachment=True)


front end html
{% for file in ticket.attach %}
            <ul class="list-group">
                <a href="{{ url_for('download', filename=file) }}" download class="list-group-item list-group-item-action"> {{ file }}</a>
            </ul>
        {% endfor %}


when I click on the download button nothing is downloaded "No File"!

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question