るびきち様 えいじです。

アドバイス有り難うございます。

結局、マルチパートの場合はescapeHTML処理してはならないフォームデータも含
まれますので一括処理は止め、下記のように個別処理することにしました。

○テキストデータの場合
text_formgmdata = cgi.params['text_formgmdata_name'][0].read
text_formgmdata = CGI.escapeHTML(text_formgmdata)

○画像データの場合
image_formgmdata = cgi.params['image_formgmdata_name'][0].read

※マルチパートの場合、取得記述を見るとやはりデータはArray of StringIO
のようですね。

なお、マルチパートでない場合は、特にescapeHTML処理しても問題ないデータで
ばかりですし、又多くのセクションで取得が必要なため当初のとおり事前に一括
処理してデータ取得することとしました。

でも、マルチパートの場合でも一括処理する方法について、るびきち様のアドバ
イスを元に今後もチャレンジしてみたいと思います。

有り難うございました。






On Tue, 16 Sep 2008 19:03:44 +0900 に:
rubikitch / ruby-lang.org さんから以下のメールを頂きました:

> From: 宮崎 詠二 <eiji / tm-21.com>
> Subject: [ruby-list:45504] Re: マルチパートフォームデータのescapeHTML
> Date: Tue, 16 Sep 2008 14:26:35 +0900
> 
> > > マルチパートフォームデータの場合はStringの代わりにStringIOになっているので、
> > > 「.read」をつけくわえてみましょう。
> > 
> > 下記のように「.read」をつけくわえてみましたがどうもうまくゆかないようで
> > した。
> > 
> > require "cgi"
> > cgi = CGI.new
> > params = cgi.params
> > params.each{|key, val|
> > val = val.read
> 
> 舌足らずですみません。
> マルチパートではない場合は val は Array of String ですが、
> 今回の場合は Array of StringIO となります。
> val.first.read でパラメータを取得できます。
> 
> なお、フォームで同じコントロール名を複数個指定できるため、
> CGI#paramsの結果は配列のハッシュになっています。
> 多くの場合は最初の値を取得するので、利便性のためにCGI#[]があります。
> 
> 言うまでもないですが、このCGIスクリプトには出力がないので出力を書かない
> とエラーになります。
> 
> 
> > > escapeHTMLはあくまでHTML出力時に変換すべきであって、cgi#paramsを上書きすべきではありません。
> > 
> > あらかじめタグ処理したものを保存して出力時にはいつでも安心して使用できる
> > ようにと思ったのですが良くないようですね。
> 
> どうしてもというならば、新しいハッシュ、たとえば escaped_params とかに
> 格納するとよいでしょう。
> 
> --
> rubikitch
> Blog: http://d.hatena.ne.jp/rubikitch/
> Site: http://www.rubyist.net/~rubikitch/
>