TreeFrog Framework

High-speed C++ MVC Framework for Web Application

ファイルのアップロード

ファイルのアップロードのためのフォームをつくりましょう。下はERBで書く例です。formTag() メソッドの第3引数に true を指定することで、 multipart/form-data のフォームが生成されます。

<%== formTag(urla("upload"), Tf::Post, true) %>
 <p>
 File: <input name="picture" type="file">
 </p>
 <p>
 <input type="submit" value="Upload">
 </p>
</form>

この例では、ファイルのアップロード先は同じコントローラの upload アクションになります。

アップロードファイルを受け取るアクションでは、次のメソッドを使うことでそのファイルをリネームすることができます。アップロードファイルは一時ファイルの扱いなので、リネームしないとアクション終了後にファイルは自動的に削除されます。

TMultipartFormData &formdata = httpRequest().multipartFormData();
formdata.renameUploadedFile("picture", "dest_path");

元のファイル名は次のメソッドで取得することができます。

QString origname = formdata.originalFileName("picture");

あまり使われないかもしれませんが、次のメソッドでアップロード直後の一時ファイル名を取得することができます。重複しないようにランダムなファイル名が付けられています。

QString upfile = formdata.uploadedFilePath("picture");

可変個のファイルのアップロード

アップロードするファイルの数があらかじめ決まっていれば、上記の方法で対応することができますが、決められないケースもありえます。JavaScript ライブラリを使えば、可変個のファイルをアップロードすることが容易にできます。
TreeFrog Framework はこのようなケースにも対応しています。以下の例では、分り易くするために2個のファイルの場合で説明します。

次のようにフォームを作成します。

<%== formTag(urla("upload"), Tf::Post, true) %>
 <p>
 File1: <input name="picture[]" type="file">
 File2: <input name="picture[]" type="file">
 </p>
 <p>
 <input type="submit" value="Upload">
 </p>
</form>

JavaScript で動的にinputタグを作成する場合、name="picture[]" というように名前の末尾に "[]" をつけるのがポイントです。

アップロードファイルを受け取る uploadアクションでは、次のように TMimeEntity オブジェクトを通して2つのファイルにアクセスできます。イテレータを使用するのがポイントです。

QList<TMimeEntity> lst = httpRequest().multipartFormData().entityList( "picture[]" );
for (QListIterator<TMimeEntity> it(lst); it.hasNext(); ) {
 TMimeEntity e = it.next();
 QString oname = e.originalFileName(); // 元のファイル名
 e.renameUploadedFile("dst_path.."); // リネームファイル
 :
}

Search

Languages

Translate

Users Guide

Many Thanks to

© 2010 - 2025 TreeFrog Framework Project

AltStyle によって変換されたページ (->オリジナル) /