Pythonで作る簡易アップローダー

IMG_0845

IMG_0845

友達から、「結婚式のサプライズムービーを作る。したがって、みんながムービーをアップロードするためのWebサイトを作って欲しい」と言われた。

なので、Pythonで作った。俺はどちらかと言うとPython主義たまにPerl派。Rubyは使ったことない。
ソースを貼るので、必要があったら使ってみてね。ちなみに、超適当なソースで、htmlだっつってんのにplain textを吐いたりと、中々素晴らしい行儀の悪さのプログラムですが、そこいらはご愛敬。

upload.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>FileUpload</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head><body><h1>簡易アップローダー</h1>
<form action="upload.cgi" method="POST" enctype="multipart/form-data">
お名前: <input name="name" type="text"><br>
ファイル: <input name="file" type="file"><br>
<input name="submit" type="submit">
</form>
</body>
</html>

upload.cgi

#!/usr/local/bin/python
# -*- coding: EUC-JP -*-

import cgi
import cgitb; cgitb.enable()
import os, sys

print "Content-Type: text/html; charset=EUC-JP"
print

UPLOAD_DIR = "./tmp"

def save_uploaded_file (upload_dir):
    form = cgi.FieldStorage()
    if not form.has_key("file"):
        print "ファイルを入力してください"
        return
    fileitem = form["file"]
    if not fileitem.file:
        print "ファイルを入力してください"
        return

    if not fileitem.filename:
        print "ファイルを入力してください"
        return

    if form["name"].value is "":
        print "名前を入力してください"
        return

    fout = file (os.path.join(upload_dir, form["name"].value + os.path.basename(fileitem.filename)), 'wb')
    while 1:
        chunk = fileitem.file.read(100000)
        if not chunk: break
        fout.write (chunk)
    fout.close()
    print "送信しました"

save_uploaded_file(UPLOAD_DIR)

使い方

上記の、upload.htmとupload.cgiをアップロードして、同じディレクトリにtmpディレクトリを作って下さい。そこに保存されます。
実行権限や拡張子とかは、サーバ環境によって変わりますので、良い感じに設定してやって下さい。プログラム的にはなんら特殊なことはしていないので、hello worldできれば同じ方法で動くはずです。

さくらのレンタルサーバーだと、どうもUTF-8がpythonから使えないようで、(.encode('utf-8')をやっても出力ストリームがasciiだとか怒られる)EUC-JPで出力するようにしています。従って、最初の文字コード宣言もEUC-JPになってます。

さくらのレンタルサーバーは値段の割に高機能でとても気に入っているのですが、こういう、自分でどうこう出来ないような場面に出くわすとやっぱ自宅サーバーを立てたくなってくるよねー。最新のAtom 2500シリーズがすごく低消費電力なので、いつか自宅サーバーにしちゃおうっかな、でも、固定IPが・・・いや、・・・そこはDDNSで・・・いや、じゃあ、電気代も考えるとレンタルサーバーの方が・・・。などといつまで経っても踏ん切りが付かない。

後日談もあるよ。