ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Perlコミュの画像ファイルのアップロードについて

  • mixiチェック
  • このエントリーをはてなブックマークに追加
mixiのこのフォームのように画像とコメントをアップロードしたいと考えています。
「CGI&PERLのポケットリファレンス」を参考にしているのですが、
これは元々画像を1枚アップロードするupload.cgiが載っていました。
○改造したい要点
・画像の枚数を増やしたい。
・コメントも記入したい。
・画像の名前をローカルの名前(英数字)と同一にしたい。

本当は参考書のソースは短いので全部記述して解説をお願いしたいのですが、著作権のこともあると思いますので抜粋で。。。

===
# アップロード先
$upload->set_directory($Temp) or
exitError("ディレクトリ $Temp がオープンできません。");
# プラットフォームの設定
$upload->set_platform($Platform);
# バッファーサイズの設定
$upload->set_buffer_size ($BUFSZ);
# ファイル名の変換
$filename = $upload->filter_filename(\&convName);

$upload->close_all_files;

# フォームデータの解析
%data = $upload->parse_form_data;
===
sub convName
{
local($name) = shift;

$name =~ tr/A-Z/a-z/; # 大文字から小文字へ変換
$name =~ s/(?:%20)+/_/g; # 空白文字を_に変換
$name =~ s/%[\da-fA-F]{2}//g; # %xx を削除

$name2 .= .$name; #←A.ちょっと実験
return ($name);
}
===
1.まずは画像の数を2つに増やしてみたのですが問題なしでした。
>ループしているわけではないのに、なぜだろう、不思議。。。

2.名前が時刻データのようなモノ?がどうしても入ってしまいます。
ローカル:0065.jpg
アップ後:1126511724__0065.jpg
Aを記述してアップ完了画面でprintすると 0065.jpg 0066.jpg とファイル名がキレイに入っていました。

3.画像以外のコメントデータはどうやって受け取ればよいのでしょうか?

うまく説明できなくて申し訳ないのですが、ご教授よろしくお願いいたいします。

コメント(6)

use CGI_Lite;
しているものという想像で書きますけど
#抜粋するのはかまわないし好ましいと思うのですが、これだけだと場合によって答える人にとって重要な情報が抜け落ちると思います・・・

2.タイムスタンプについては
$upload->add_timestamp(0);
で消えるでしょう。

(http://search.cpan.org/~shgun/CGI_Lite-1.8/CGI_Lite.pmをご覧ください)

あとは質問の意図がちょっとよくわからなかったので・・・
1.「問題なし」っていうのは・・・?
3.フォームで他に<input type="text" ... >とかで送信するという意味ですか?だとしたらCGI.pmあたりと組み合わせて使えばいいのかな・・・?
CGI_Lite の使い方はよく知らないのですが、見た目の仕様的な感覚で。

1.CGI_Lite が対応しているので何個でも大丈夫なはず。
2.KIDD さんの回答参照で。
3.この辺りの命令で何か出ませんか?
   $upload->print_form_data;

multipart/form-data を扱う場合は受け取り側の処理が通常と
異なるだけなので、その辺りを CGI_Lite が対応していると思います。
(データが MIME 形式で送られる)
はい、use CGI_Lite;しています。
タイムスタンプについては、上記抜粋ソースではなくて、CGI_Lite
そのものをいじるのだなぁと理解できました!
1の問題なしというのは、少しはperlのソースを読めるつもりだった
のですが、1回しか画像をうけとっていないように思えるのに何故
複数画像を処理できているのかが不思議に思ったのでした。。。
3についてはおっしゃる通り、フォームでtextを受けたいのです。
これからもうちょっとソースとにらめっこしてみますね。
ありがとうございます!
>KIDD@骨折完治?さん

なるほど、multipart/form-data指定しているから普段通り
そのままPOSTされたデータをreadすることができないのですね。。
現状、ソースの頭でPOSTされた色々なデータを判別する為に
readしたいのですが、InternalServerErrです。。
print_form_dataの辺りですか・・・ちょっと調べてみます。
ありがとうございます!
> みゃ'さん
>タイムスタンプについては、上記抜粋ソースではなくて、CGI_Lite
>そのものをいじるのだなぁと理解できました!
理解が間違っていると思うに一票。
CGI_LiteはCPANモジュールなので弄らんと思いますよ。私は。
ていうか "CGI_Lite" でぐぐれば、そんなのいくらでもサンプルやマニュアルなんかの参考サイトが見つかると思うに一票。

> タイムスタンプ
どうしてもできないんだったら、rename すればいいじゃない。
>タイムスタンプについては、上記抜粋ソースではなくて、
>CGI_Liteそのものをいじるのだなぁと理解できました!

あの私の発言が(なぜか)誤解されているのでフォローしときますケド…

日本語じゃなかったからダメとか?
http://perldoc.jp/docs/modules/CGI-Lite-2.001-emergencyrelease/Lite.pod

もうむしろコレとか。(文書末尾)
http://mtlab.ecn.fpu.ac.jp/WSM_1999/991101175411.html

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Perl 更新情報

Perlのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング