Top / Programming / Python / Python CGIプログラミング入門 / ファイルをアップロードする

ファイルをアップロードする

ファイル選択コントロールで選択されたファイルをアップロードします。

test15.cgi

#!/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()

書き込みが終了したらファイルを閉じます。

関連URL

更新履歴