8

HTMLフォームがあり、Pythonを使用して入力に基づいてログファイルを生成しています。また、ユーザーが必要に応じて画像をアップロードできるようにしたいと思います。Pythonがあれば、それを操作する方法はわかりますが、画像をアップロードする方法がわかりません。これは確かに以前に行われたことがありますが、例を見つけるのに苦労しています。誰かが私を正しい方向に向けることができますか?

基本的に、私はログを作成するためにcgi.FieldStoragecsv.writerを使用しています。ユーザーのコンピューターから画像を取得し、それをサーバー上のディレクトリに保存したいと思います。次に、名前を変更して、CSVファイルにタイトルを追加します。

これにはたくさんの選択肢があることを私は知っています。私は彼らが何であるかを知らないだけです。誰かが私をいくつかのリソースに向けることができれば、私は非常に感謝するでしょう。

4

2 に答える 2

8

あなたの特定のアプリケーションはpythoncgiモジュールで使用するためのものであるとあなたが言ったので、簡単なグーグルはたくさんの例を見つけます。これが最初のものです:

最小限のhttpアップロードcgi(Pythonレシピ)snip

def save_uploaded_file (form_field, upload_dir):
    """This saves a file uploaded by an HTML form.
       The form_field is the name of the file input field from the form.
       For example, the following form_field would be "file_1":
           <input name="file_1" type="file">
       The upload_dir is the directory where the file will be written.
       If no file was uploaded or if the field does not exist then
       this does nothing.
    """
    form = cgi.FieldStorage()
    if not form.has_key(form_field): return
    fileitem = form[form_field]
    if not fileitem.file: return
    fout = file (os.path.join(upload_dir, fileitem.filename), 'wb')
    while 1:
        chunk = fileitem.file.read(100000)
        if not chunk: break
        fout.write (chunk)
    fout.close()

このコードは、ファイルのようなオブジェクトになるファイル入力フィールドを取得します。次に、それをチャンクごとに出力ファイルに読み込みます。

アップデート04/12/15:コメントごとに、この古いactivestateスニペットのアップデートに追加しました:

import shutil

def save_uploaded_file (form_field, upload_dir):
    form = cgi.FieldStorage()
    if not form.has_key(form_field): return
    fileitem = form[form_field]
    if not fileitem.file: return

    outpath = os.path.join(upload_dir, fileitem.filename)

    with open(outpath, 'wb') as fout:
        shutil.copyfileobj(fileitem.file, fout, 100000)
于 2012-08-28T19:47:11.443 に答える
3

WebフレームワークのPyramidが良い例です。 http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/forms/file_uploads.html

これが、作業中のプロジェクトで使用するサンプルコードです。

    extension = os.path.splitext(request.POST[form_id_name].filename)[1]
    short_id = str(random.randint(1, 999999999))
    new_file_name =  short_id + extension
    input_file = request.POST[form_id_name].file
    file_path = os.path.join(os.environ['PROJECT_PATH'] + '/static/memberphotos/', new_file_name)

    output_file = open(file_path, 'wb')
    input_file.seek(0)
    while 1:
        data = input_file.read(2<<16)
        if not data:
            break
        output_file.write(data)
    output_file.close()
于 2012-08-28T19:33:18.440 に答える