MovableType のコメント欄でファイルをアップロードする

Posted by
ぴろり
Posted at
2005/09/03 20:34
Trackbacks
関連記事 (0)
Comments
コメント (13)
Post Comment
コメントできます
Category
プラグイン カテゴリ

 MovableType のコメント欄で、読者からのコメントを受付ける際に、コメントと一緒に画像ファイルなどの添付ファイルを受付けるための改造を紹介しています。元ネタは mixi のMovableType コミュニティでのトピックでした。現時点では、アップロードされたファイルへの URL とファイルサイズを取得するプラグインが実装されています。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

追加されるテンプレートタグ

MTCommentFileUpload
アップロードされたファイルにアクセスする MTUpfile* タグを使うためのコンテナタグ。
MTUpfileLink
アップロードされたファイルの絶対 URL を返します。MTCommentFileUpload タグの内部で使えます。
MTUpfileSize
アップロードされたファイルのファイルサイズをバイト単位で返します。MTCommentFileUpload タグの内部で使えます。

導入方法

Step 1. プラグインのインストール

 ダウンロードしたアーカイブに含まれる MTCommentFileUpload.pl を適当なエディタで開き、 以下の行をあなたの環境に合わせて修正します。 アップロードされたファイルはここで指定されたパスに保存されます。 最終的なパスはローカルサイトパス+szUpfilePath で指定されたパスとなります。
;### アップファイルのパス (ローカルサイトパス基準)
our $szUpfilePath = '/archive/src';

 次に、MTCommentFileUpload.pl をMovableType のプラグインフォルダにコピーします。 MovableType のメインメニューに追加したプラグイン名が表示されていることを確認します。

Step 2. コメント投稿フォームの修正

 コメント投稿フォームにアップロードファイル用フィールドを追加します。
<form method="post" action="<$MTCGIPath$><$MTCommentScript$>"
		enctype="multipart/form-data"> ← enctype を忘れずに追加します
:
添付ファイル:<input type="file" name="file"> ← アップロードファイル用フィールドを追加します

Step 3. /MT/lib/MT/App/Comments.pm の修正

 /MT/lib/MT/App/Comments.pm にアップロードされたファイルを保存する処理を追加します。 以下を参考にして Comments.pm で定義されている post 関数を修正します。

表示しているコードは MoavableType 3.151-ja のものです。

	:
    return $app->handle_error($app->errstr()) unless $comment;

;### ファイルアップロード準備 2005/09/03
my $szUpFileName;
{
	;# アップファイル上限サイズ
	my $nMaxUploadSize = 1024 * 1024;# Bytes
	;# アップできるファイル拡張子
	my @arAllowFileExt = ('jpg', 'jpeg', 'gif', 'png', 'bmp');
	;# アップファイルの格納パス(ローカル・サイト・パス基準)
	my $szUploadFilePath = $blog->site_path. '/archive/src';

	my $fh = $q->upload('file');
	if ($fh) {
		;# ファイルタイプのチェック
		my $filename = $q->param('file');
		my ($file_ext) = $filename =~ /.([^/:.]+)$/;
		my @ret = grep { /$file_ext/ } @arAllowFileExt;
		scalar (@ret)
				or return $app->handle_error ("指定されたファイルはアップロードできません");
		;# サイズチェック
		seek ($fh, 0, 2);
		if ($nMaxUploadSize < tell ($fh)) {
				return $app->handle_error ("アップロード制限サイズ($nMaxUploadSize バイト)を超えました");
		}
		$szUpFileName = $szUploadFilePath. '/%d.'. $file_ext;
	}
};### ここまで

	## Here comes the fancy logic for deciding whether or not the
	## comment appears.
	:

 同時にアップファイルに関する制限を設定することができます。

nMaxUploadSize
アップファイルの上限サイズをバイト数単位で指定します。 ここで指定されたサイズを超えてアップロードを行おうとするとエラーとなります。
arAllowFileExt
アップファイルの拡張子を網羅します。 ここで指定された以外のファイルをアップロードしようとするとエラーとなります。
szUploadFilePath
アップファイルの保存先パスを指定します。 ファイルはローカルサイトパス+szUploadFilePath で指定されたパスに保存されます。
		if (MT->run_callbacks('CommentFilter', $app, $comment))
		{
            $comment->save;
			;### ファイルアップロード 2005/09/03
			if ($szUpFileName) {
				$szUpFileName = sprintf ($szUpFileName, $comment->id);
				unlink $szUpFileName;
				my $fh = $q->upload('file');
				seek ($fh, 0, 0);
				open (OUT, ">$szUpFileName")
						or return $app->handle_error ("$szUpFileName を開けませんでした");
				binmode OUT;
				my $buffer;
				while (read ($fh, $buffer, 1024)) {
					print OUT $buffer;
				}
				close OUT;
			};### ここまで
			$blog->touch;
			$blog->save;
    :

Step 4. 個別アーカイブテンプレートの修正

 個別アーカイブのテンプレートを修正し、コメント欄に添付されたファイルを表示できるようタグを追加します。
<MTComments>
<$MTCommentAuthor$> at <$MTCommentDate><br />

<MTCommentFileUpload>
<img src="<$MTUpfileLink$>" align="left" alt="<$MTUpfileSize$> Bytes">
</MTCommentFileUpload>

<$MTCommentBody$>

</MTComments>

ダウンロード

ダウンロード / MD5バージョン日付サイズ(Bytes)動作環境備考
MTCommentFileUpload
GetMD5Hash('MTCommentFileUpload010.zip');
0.10 new '05/09/03 GetFileSize('MTCommentFileUpload010.zip'); MovableType 3.151-ja で動作確認

楽屋裏

 アイディアは以前からあったのですが、なかなか実装に着手できませんでした。 とりあえず、最低限の機能は実現できましたが、まだまだ改善の余地はありそうです。 画像ファイルがアップされた場合にのみ、画像の縦横サイズを取得できるタグや、 縮小画像(サムネール)を自動生成してくれる機能なんかあれば便利かもしれません。
この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:CAPTCHA によるコメントスパム対策

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

寄せられたコメント (全 13 件中、最新 5 件まで表示しています)

Posted by
megumegu
at
2007/09/18 23:18
ID
jF7B5.do
ぴろりさん、はじめまして!
以前からあこがれていたMTでブログを楽しもうと現在準備中です。
友人と楽しく意見交換などできたらと思い、何か良いプラグインはないものかと
いろいろ探していましたら、こちらのプラグインを発見!
さっそく使わせていただこうと思ったのですが、私も
if (MT->run_callbacks('CommentFilter', $app, $comment))以下の
挿入がわからず…(TT▽TT)ダァー(3.35を使用)
バージョンアップ楽しみにしています!
PS こちらのプラグインを使用されているサイトさんを見てみたいのですが、
よろしかったら教えていただけないでしょうか?
Posted by
ryoryo
at
2007/04/01 13:56
ID
Aakuoi46
初めまして。
MT3.34で導入させて頂きました。
ありがとうございます。
動作は問題ないのですが、コメント投稿画面で設定したパスを
プレビュー画面で表示できずに困っています。
申し訳ありませんが、値を取得する方法がありましたら教えて頂けますか?
Posted by
tagawatagawa
at
2007/02/09 09:37
ID
W/KwJfMU
いつも参考にさせてもらっています
私もMT3.3対応切望しております
対応版楽しみにまっています
Posted by
chamachama
at
2007/01/19 10:55
ID
H7fxX29M
お返事ありがとうございます。
バージョンアップしましたら、是非利用させてもらいます!
できましたら、そのときにでもご一報を!
よろしくお願いいたします。
Posted by
ぴろり ◆OLEEi.VOX.ぴろり ◆OLEEi.VOX.
at
2007/01/18 19:25
ID
9OaufDmo
こんにちは。
記事がアップデートされておらず申し訳ありません。
今ならMTシステムを直接書き換えるよりもプラグイン一本で導入できる方が確実便利ですね…
時間をみてバージョンアップしたいと思います。すみません。

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。