1

I work on a project for my university. We've learned the basics of python. The task is to create a small program which reads a fastq file and analyses it. I thought it would be nice to create a html based user-interface with bottle. But without a real server.
My problem is: I don't know how I can access the uploaded file. The code does not create a new directory. I also don't know where I can find the "uploaded" file or how a new function on the serversite can grab this file and work with it.
I've read the following sites:
http://bottlepy.org/docs/dev/tutorial.html#file-uploads
http://bottlepy.org/docs/dev/api.html#bottle.FileUpload.file How do I access an uploaded file with Bottle?
Bottle file upload and process and others.

Also, the Error annoys me when I try upload a file and the Error is, that the file already exists. There is the class UploadFile with the function save, which has an option for overwriting but I don't know how to implement it.

bottle_test.py:

from bottle import route, run, template, static_file, request, response, url, default_app, get, post, FileUpload
import bottle
import os
# Aufrufen der Hauptseite
@route('/')
def index():
return template('main_template')
# Einbinden unterschiedlicher Dateien z.B. Bilder oder CSS-Files
@route('/static/style/<filepath:re:.*\.css>')
def server_static(filepath):
return static_file(filepath, root='static/style')


@route('/static/images/<filepath:re:.*\.(jpg|png|gif|ico|svg)>')
def img(filepath):
    return static_file(filepath, root="static/images")

@route('/static/sonstige-bilder/<filepath:re:.*\.(jpg|png|gif|ico|svg)>')
def img(filepath):
    return static_file(filepath, root='static/sonstige-bilder')
# Formularabfrage
@route('/repeat', method='POST')
def do_login():
    username = request.forms.get('username')
    password = request.forms.get('password')
    if username == 'arsenij' and password == '1234':
        return "<p>Your login information was correct.</p>"
    else:
        return "<p>Login failed.</p>"

@route('/upload', method='POST')
def do_upload():
category = request.forms.get('category')
upload = request.files.get('upload')
name, ext = os.path.splitext(upload.filename)
if ext not in ('.fastq'):
    return 'File extension not allowed.'

save_path = '/tmp/(category)'
if not os.path.exists(save_path):
    os.makedirs(save_path)

file_path = "{path}/{file}".format(path=save_path, file=upload.filename)
upload.save(file_path)
print(request.files.get('upload'))
return 'File uploaded'

if __name__ == '__main__':
    bottle.debug(True)
    bottle.run(host='0.0.0.0', port=8080,  reloader=True)

main_template.tpl

<form action="/upload" method="post" enctype="multipart/form-data">
Category:      <input type="text" name="category" />
Select a file: <input type="file" name="upload" />
<input type="submit" value="Start upload" />
</form>
Community
  • 1
  • 1
Mars_ars
  • 13
  • 3

1 Answers1

1

The documentation for FileUpload.save shows how to do this:

upload.save(file_path, overwrite=True)
ron rothman
  • 17,348
  • 7
  • 41
  • 43