PythonのBottleを利用してファイルアップロード機能を実装する方法を現役エンジニアが解説【初心者向け】

初心者向けにPythonのBottleを利用してファイルアップロード機能を実装する方法について現役エンジニアが解説しています。BottleとはPythonでWebアプリケーションを開発するためのフレームワークです。Pythonでは他にDjangoやFlaskなどのWebフレームワークがあります。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

PythonのBottleを利用してファイルアップロード機能を実装する方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して、初心者向けに解説します。

Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプ、Python講座の内容をもとに紹介しています。

 

田島悠介

今回は、Pythonに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

PythonのBottleを利用してファイルアップロード機能を実装する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

Bottleとは

BottleとはPythonでWebアプリケーションを開発するためのフレームワークです。

PythonではDjangoやFlaskなどのWebアプリケーションのためのフレームワークが存在しますが、その中でもBottleはシンプルな構成を特徴とし、主に小規模なWebアプリケーション開発や、Webプリケーション開発の入門にお勧めのフレームワークです。

ファイルアップロード機能を実装する方法

bottleフレームワークでファイルアップロード機能を実装する方法については大きく分けて下記2つの機能を用意する必要があります。

  • アップロードするファイルを選択するフォーム画面(GET)
  • 選択したファイルをアプリ内にアップロードする機能(POST)

アップロードするファイルを選択するフォーム画面の実装はGETメソッドを使用した下記の様な文法を使用します。

@route('ファイルアップロード機能を実装するパス', method='GET')
def upload():
  return '''
    <form action="/upload" method="post" enctype="multipart/form-data">
      # ファイル選択フォーム
      <input type ="file" name="任意の名前"></br>
      # 決定ボタン
      <input type ="submit" value="ボタンラベルの名前"></br>
 '''

選択したファイルをアプリ内にアップロードする機能の実装はPOSTメソッドを使用した下記の様な文法を使用します。

@route('ファイルアップロード機能を実装するパス', method='POST')
def do_upload():
    upload = request.files.get('フォームで指定した任意の名前', '')
    save_path = 'アップロード先フォルダのパス'
    upload.save(save_path)
    return 'Upload OK.'

注目点として、GETメソッド内で記述しているフォームからPOSTメソッドを呼び出す事で、ファイルを選択後アップロードするという一連の機能を実装しています。

[PR] Pythonで挫折しない学習方法を動画で公開中

実際に書いてみよう

それでは、Bottleフレームワークを使ってファイルアップロード機能を実装する方法についてサンプルコードを例に実際に書いてみましょう。

今回のサンプルコードを学習する事前準備として、任意の場所に[sample]フォルダを作成します。そしてアップロード先のフォルダを[sample]フォルダ内に”static”フォルダを作成し、さらに”static”フォルダ内に”upload”フォルダを作成します。

[sample]
    └─static
         └─upload

サンプルコードは任意の名前でsampleフォルダ内に作成してください。

今回は、アップロードするファイルを指定し、先ほど作成した”upload”フォルダへファイルアップロードするサンプルコードを作成していきます。

サンプルコード

from bottle import route, run, template, request, static_file, url, get, post, response, error, abort, redirect, os
import sys, codecs
import bottle.ext.sqlalchemy
import sqlalchemy
import sqlalchemy.ext.declarative
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

@route("/")
def html_index():
  return template("index", url=url)

@route("/static/<filepath:path>", name="static_file")
def static(filepath):
  return static_file(filepath, root="./static")

@route("/static/upload/<img_filepath:path>", name="static_upload")
def static_upload(upload_filepath):
  return static_upload(upload_filepath, root="./static/upload/")

# ファイルアップロード機能実装
# アップロードするファイルを選択する画面の実装(GET)
@route('/upload', method='GET')
def upload():
  return '''
    <form action="/upload" method="POST" enctype="multipart/form-data">
      <input type="file" name="upload"></br>
      <input type="submit" value="アップロード"></br>
    </form>
  '''

# 選択したファイルをアップロードする機能の実装(POST)
@route('/upload', method='POST')
def do_upload():
  upload = request.files.get('upload', '')
  save_path = './static/upload/'
  upload.save(save_path)
  return 'アップロードが完了しました。[保存先: %s%s' % (save_path, upload.filename) + ']'

run(host='localhost', port=8080)

 

実行結果

実行後http://localhost:8080/uploadにアクセスします。アクセスすると、ファイル選択画面が表示されます。

PythonのBottleを利用してファイルアップロード機能を実装し、トップページにアクセスした状態。

ファイルを選択からアップロードする任意のファイルを選択します。今回は”sample.txt”というファイルを選択しました。

PythonのBottleを利用してファイルアップロード機能を実装して、sample.txtをアップロードを選択した状態。

任意のファイルを選択後、アップロードボタンをクリックすると、以下のような画面が表示されます。

PythonのBottleを利用してファイルアップロード機能を実装して、ファイルのアップロードが完了した状態。

アップロード完了後に事前に用意しておいた”upload”フォルダを参照すると問題なく指定したファイルが存在することが確認できます。

PythonのBottleを利用してファイルアップロード機能を実装して、ファイルをアップロードしてuploadフォルダにファイルがあることが確認できる。

解説

それではサンプルコードの内容について解説していきます。

  1. 8-18行目では、先ほど作成したアップロード先のフォルダのルーティングを行っております
  2. 22-29行目では、GETメソッドを使用したファイルアップロード用のフォームをuploadページに設定しています。
  3. 26行目では、選択ファイルの名前をname=”upload”と設定し、コード34行目でrequest.files.get()を使用して指定したファイル情報を変数uploadに指定しています
  4. 27行目では、決定ボタンを設定しています。今回はボタンのラベル名を”アップロード”と設定しました
  5. 32-37行目では、フォームで選択したファイルを”upload”フォルダへのアップロード処理を設定しています
  6. 36行目では、コード34行目で取得したファイル情報をもとに.saveコマンドを使用して指定のフォルダへ保存しています
  7. 37行目では、アップロードが完了したことをページに表示するように設定しています

実行結果では実際にファイルを選択して、アップロードするまでの機能が実装されている事が確認できます。

まとめ

今回は、PythonのBottleを利用してファイルアップロード機能を実装する方法について紹介しました。

冒頭でも紹介したようにBottleフレームワークはシンプルな構造でWebアプリケーションの開発入門にオススメのフレームワークです。今回紹介したような基本的な機能の実装についてさらに理解を深めオリジナルのWebアプリ開発へと役立てて下さい。

監修してくれたメンター

菅繕久(すがよしひこ)

現在はフリーランスのエンジニアをしていてプログラミング歴は8年目になります。

普段は Python、FileMaker等を使って様々な業務で活用できるIoTプロダクトRPAツールを作成しています。

開発実績としては、業務自動化ツール(在庫管理・発注・ファイル操作 etc)、電子カルテシステム、ロボット用プログラムなどがあります。
TechAcademyではPythonコースを担当しております。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも最短4週間で、Pythonを使った人工知能(AI)や機械学習の基礎を習得できる、オンラインブートキャンプを開催しています。

また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。