ファイル選択コントロールで選択されたファイルをアップロードします。
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
ファイルをアップロードする
'''
html = '''Content-Type: text/html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8" />
<title>ファイルをアップロードする</title>
</head>
<body>
<h1>ファイルをアップロードする</h1>
<p>%s</p>
<form action="test15.cgi" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" />
</form>
</body>
</html>
'''
import cgi
import os, sys
try:
import msvcrt
msvcrt.setmode(0, os.O_BINARY)
msvcrt.setmode(1, os.O_BINARY)
except ImportError:
pass
result = ''
form = cgi.FieldStorage()
if form.has_key('file'):
item = form['file']
if item.file:
fout = file(os.path.join('/tmp', item.filename), 'wb')
while True:
chunk = item.file.read(1000000)
if not chunk:
break
fout.write(chunk)
fout.close()
result = 'アップロードしました。'
print html % result
try:
import msvcrt
msvcrt.setmode(0, os.O_BINARY)
msvcrt.setmode(1, os.O_BINARY)
except ImportError:
pass
msvcrtモジュールはWindowsでのみ使用できるモジュールです。
msvcrt.setmode(0, os.O_BINARY)
msvcrt.setmode(1, os.O_BINARY)
ファイルの読み込みを書き込みをバイナリモードに設定します。 この処理はWindowsのみ必要になります。
import cgi
f = cgi.FieldStorage()
HTMLフォームから送信された値は、cgiモジュールのFieldStorageクラスを使用して取得します。
if form.has_key('file'):
item = form['file']
if item.file:
if form.has_key('file') で値が存在することを確認し、item = form['file'] で FieldStorage クラスのインスタンスを取得します。
if item.file: でファイルのデータが存在することを確認します。item.file はファイルでなければ None を返します。
fout = file(os.path.join('/tmp', item.filename), 'wb')
item.filename はfileのコントロールに対してクライアントが設定したファイル名を返します。
os.path.join() は、そのプラットフォームで適切なパス区切り文字で連結した文字列を返します。
file(filename, mode) は filename で指定されたファイルを mode のモードで開きます。
ここでは、/tmpフォルダに選択されたファイル名でファイルを作成します。
while True:
chunk = item.file.read(1000000)
if not chunk:
break
fout.write(chunk)
fout.close()
アップロードされたデータから1000000バイト読み込みます。
if not chunk:
break
読み込むデータがなくなれば、ループを抜けます。
fout.write(chunk)
読み込んだデータをファイルに書き込みます。
fout.close()
書き込みが終了したらファイルを閉じます。