Sn Uploader カスタマイズ
菅処さんの Sn Uploader をカスタマイズしたもの。
- 投稿日 : 2007.09.26
- カテゴリー : HTML 関連
概要
このスクリプトは菅処さんのアップローダースクリプト「Sn Uploader」を改造、再配布するものです。
HTML 4.01 Strict を目指しました。スクリプトを見て、HTML の表示に関わる部分だけを変更しています。当方の Perl スクリプトの知識は皆無に等しいです。
要素の装飾の大部分を CSS に移動しています。大まかなデザインはこちらで変更できると思います。スタイルシートの要素の指定は、オリジナルのデザインを再現する部分にとどめています。
利用規定
このスクリプトの著作権は作者 (菅処さん) に帰属しますが、利用者の責任において自由に改変・運用することができます。
また利用したことによって発生した損害に対して作者及び改造者 (tnetsixenon) は一切の責務を負わないものとします。
このスクリプトは Sn Uploader 再配布規定 1.0 に基づいて再配布されます。
サンプル
ダウンロード
Sn Uploader カスタマイズ (2007/09/26)
設置
配布ファイルを展開すると、以下のファイルが抽出されます。(スラッシュ付きの文字列は、ディレクトリを示します)
- uploader+cgipm/
- upload.cgi
- upload.css
- uploader/
- upload.cgi
- upload.css
uploader ディレクトリは NoCGI.pm 版、uploader+cgipm/ ディレクトリは CGI.pm 版となっています。
upload.cgiをエディタ等で開き、「$set{'title'}」から「$set{'link_target'}」までのパラメータを設定します。以下にパラメータの項目を示します。
$set{'title'} $set{'description'} $set{'log_file'} $set{'max_log'} $set{'max_size'} $set{'min_flag'} $set{'min_size'} $set{'max_all_flag'} $set{'max_all_size'} $set{'file_pre'} $set{'pagelog'} $set{'base_html'} $set{'interval'} $set{'deny_host'} $set{'admin_name'} $set{'admin_pass'} $set{'html_dir'} $set{'src_dir'} $set{'base_cgi'} $set{'http_html_path'} $set{'http_src_path'} $set{'dlkey'} $set{'up_ext'} $set{'up_all'} $set{'ext_org'} $set{'deny_ext'} $set{'change_ext'} $set{'home_url'} $set{'html_all'} $set{'dummy_html'} $set{'find_crypt'} $set{'binary_compare'} $set{'post_flag'} $set{'post_key'} $set{'disp_error'} $set{'error_level'} $set{'error_log'} $set{'error_size'} $set{'zero_clear'} $set{'disp_comment'} $set{'disp_date'} $set{'disp_size'} $set{'disp_mime'} $set{'disp_orgname'} $set{'per_upfile'} $set{'per_dir'} $set{'per_logfile'} $set{'link_target'}
以下に、設置の一例を示します。括弧内の数字はパーミッションです。
public_html/ | +-- uploader+cgipm/ [755] | |-- upload.cgi [755] |-- upload.css [644]
public_html/ | +-- uploader/ [755] | |-- upload.cgi [755] |-- upload.css [644]
upload.cgi にアクセスすると、ログファイルとディレクトリを自動的に作成します。
アクセスした際に「メインログの作成に失敗しました」などの表示が出た場合はディレクトリのパーミッション設定を見直してください。
管理画面への入り方
削除フォームの「No.」に管理者ログイン ID、「key」に管理者パスワードを入れます。
ファイルの削除方法
-
削除フォームの「No.」に番号を入れます。up0001.jpg の場合、1, 0001, up0001, up0001.jpg 等、数値が検出できれば OK です。
JavaScript が有効な場合「D」と言う文字がファイル名の左側に出てきますのでそれをクリックされても結構です。 - 削除パスが必要なときは入力します。管理者パスを入れると全てのファイルが削除可能です。 また、削除時の IP アドレスが投稿時 IP アドレスの第 3 オクテット (192.168.0.9 の 192.168.0.) まで一致する場合、またはユーザー固有 ID が一致する場合に限っては削除パスは必要ではありません。
- 「del」を押します。また、管理者は管理画面にログインすることにより選択・一括削除ができます。
HTMLを更新したい場合
スクリプト改変・投稿パス有無等でフォームデザインが変わって更新したい場合は削除フォームで「No.」を入れず「key」に管理者パスを入れて「del」を押してください。または管理画面にログインして作業をしてください。
Cookieについて
このスクリプトでは Cookie を主に削除補助として使用しています。
- SN_UPLOAD (JavaScript)
- 投稿フォームの削除パス・投稿パスを記憶します。
- SN_DEL (JavaScript)
- 削除フォームのパスを記憶します。値がない場合 SN_UPLOAD の削除パスをコピーします。
- SN_USER (HTML_META)
- ユーザー固有 ID を記憶します。
Cookie の保存の期限とかは特に制限していないので必要ない場合は該当部分を修正してください。
管理者はまず削除フォームに管理者パスを入れ「del」を押し記憶させるとファイル削除や管理画面に入ったりする際に楽になると思います。
文字コードについて
スクリプトファイルは文字コードに Shift-JIS を使用しています。一部の文字コードが「\」と重なっている影響で、ファイル名に「表、予、ソ、ー」などが含まれているとファイル名が途中で切れます。
デザイン変更等で文字を追加挿入した場合、場所によっては 500 エラーがでることもあります。
別にバイナリが化けたりするわけではないのですが気になる人はエディタ等でスクリプト全体を EUC に変換するのがよいかと思います。
設定項目の終わりの方に $set{'html_head'} という項目があるので charset を euc-jp にすると排出 HTML の META タグ部分は書き換わります。
途中から EUC に切り替えるときはログファイルの変換もお忘れずに。
設定項目補足
- $set{'interval'}
- 同一 IP からの連続投稿を指定した秒数の間拒否します。デフォルトは 3 秒になっていますが、例えば 10 分ならば 60*10 と表記しても問題ありません。 なお最終投稿の IP・時間でしか判断していないので上記の例ですと 10 分以内に他の人がアップロードをした場合は解除されてしまいます。
- $set{'max_all_flag'}
- この値を有効にすると投稿数以外にファイルの容量でもログ落ちを判定するようになります。
- 注意としては、例えば総容量 50MB に設定した場合、サーバに既に 50MB ある状態で 10MB のファイルをアップロードされると一時的に 50MB + 10MB = 60MB が消費されます。 また複数同時アップロード時にも同様のことが言えますので少し余裕を持って (サーバ制限量よりは少なめに) 設定したほうがよさそうです。
- また保持件数制限時もそうですが、パーミッション設定、アクセス権などの関係でファイルが削除できなかった場合は (ファイルが実際に残っているので) メインログからは削除していません。 よって設定ログ数・容量より実際のログ数・容量が多くなることがあります。
- $set{'up_all'}
- この値を有効にすると $set{'up_ext'} に登録されているもの以外でもアップロードを受け付けます。 $set{'ext_org'} が無効になっている場合 (=0) は拡張子「.bin」で登録されます。 $set{'ext_org'} が有効になっている場合 (=1) は投稿時の拡張子になります。 $set{'ext_org'} を有効にする場合 (=1) はスクリプト言語など予期せぬ動作をする場合がありますのでセキュリティーには十分気をつけて下さい。
- $set{'find_crypt'}
- この値が有効になっているとアップロードされたアーカイブが暗号化されているか調べます (ZIPのみ)。暗号化されている場合は COMMENT の最初に赤の「*」が付きます。 大体検出出来てるなと思われる場合には排出HTMLのどこかに「* はパス付だ」と書いておけばダウンロードする側にも多少はメリット!?があるかなと思います。
- $set{'binary_compare'}
- この値が有効になっていると既にアップロードされているファイルとバイナリ比較をします。一致したらファイルをアップロードさせません。
- $set{'post_key'}
- $set{'post_flag'} が有効になっている場合 (=1) はこの値をフォームに入力しないとアップロードできなくなります。 投稿パスは「,」で区切ることで複数発行することができ、メインログには備考として投稿された際の投稿パスが記録されます。 途中から投稿パスを有効にする場合は投稿フォームに投稿パスの項目がありませんので HTML を直接更新してください。
- $set{'dlkey'}
- ダウンロードパスの使用の有無
- アップロードされたファイルを「./src/up****.***」から「./src/up****.***_[a-zA-Z0-9]{20}/up****.***」にリネームすることによって作成されるファイルリストのリンクより辿れなくします。 実 URL は投稿時設定したダウンロードパスにて認証することによって参照できます。
- Perl を無駄に起動したくない場合は $set{'dummy_html'} の値を 2 以上にすると、認証時の HTML を静的 HTML で吐き出すようになります。 無駄な CGI の起動が減りますので問題がなければ静的 HTML を吐き出すようにすることをお勧めします。
- $set{'zero_clear'}
- FTP など CGI 以外からの操作でファイルを削除した場合、メインログには情報が残っているがリンク先のファイルがないということがあります。 この値が有効な場合次回ファイルアップロード時に該当ファイル情報をメインログから削除します。有効にしなかった場合は次回更新時からも 0 バイトのファイルとして HTML ファイルリストに記載されます。
Sn Uploader FAQ
- 設置できません (動きません / 500 エラーがでる)
- 主に Perl のパスが違う場合や設置ディレクトリのパーミッションが違う場合が多いようです。またログファイルやファイル保存ディレクトリは初回アクセス時に自動生成しますので FTP 操作などでは作らない方が懸命です。
- 管理画面に入るのが面倒です
- 管理者はまず削除フォームに管理者パスを覚えさせてください。Cookie & JavaScript が使える場合は、次からはフォームにパスが自動入力されますので数字を入れるとファイル削除、管理者ログイン ID を入れると管理画面に入れます。
- 赤い「*」って何?
- 適当な独自実装による暗号化 ZIP 検出のマーキングです。
- 投稿パスを複数設定できるって何の意味があるんですか?
- 個人毎に発行すると誰があげてるか分かるかもしれません。 FTP のアカウント ID とパスを一人に教えたら一ヵ月後にはなぜかそのアカウント ID とパスで複数クライアントが繋がってたという話を知り合いから聞いたのでどの投稿パスでアップロードしてるか記録してみると面白いかなと複数設定できるようにしてみました。
- 削除パスを忘れてしまいました。削除フォームにも自動入力されてません
-
投稿フォームに自動入力が残っている場合に限っては
- 削除フォームの「No.」「key」ともにいれずに「del」を押す (削除 Cookie クリア)
- 投稿フォームの「Upload」を押す (削除 Cookie コピー)
- 「Upload」「Cancel」の「Upload」が消えちゃいました
-
文字コードを EUC にしようとしたのではないでしょうか?
「$set{'charset'} = euc-jp;」にしても、文字コードが SHIFT-JIS のままの場合そのように表示されることがあります。エディタや FTP 転送でスクリプトの文字コードも EUC に変換してください。 - リストの順番が投稿時間順ではありませんがなぜでしょうか?
- リストに表示される投稿時間は POST 開始時の時間です。ログが更新されるのは POST 完了後なのでログの時間表記の順番が多少入れ替わることがあります。 個人的には POST を始めた時間を投稿時間としたいのでこのような仕様になっています。というか余り気にしてませんでした。どうしてもリストも時間順にしたいというのならば DATE を POST 完了後の時間にすればよいかと思います。
「$new[0]」で検索をかけると
$new[0] = "$no<>$in{'addr'}<>$in{'time'}<>1\n";
という行がありますので、その行の上にでも
$in{'date'} = conv_date(time());
という行を足すと DATE に記録される時間は POST 完了後の時間となります。
# $in{'date'} = conv_date(time());
と既に書かれている行があるものを使っているのならば先頭の「#」を削除するだけで結構です。- 設置したらサーバが重くなりました。何か改善する方法はありますか?
-
あんま無理しないでください。
普通の掲示板等に比べるとデータの出入力が多く行われるので回線・CPU 負荷は高めになるケースが多いと思います。利用者人数や保存件数・ファイルサイズなどを考慮して使っていただければよいかと思います。 - 最大投稿容量はどれくらいまでいけますか?
-
無茶な設定・使い方はしない方がよいかと。
一応 100Mbps LAN 環境では 1GB 程度まで確認しましたがサーバ環境・クライアント環境・回線品質やその他使用環境に依存しますし、また可能と実用は違いますのである程度の運用を持って設置者自身が判断してください。 但しあまりに大きいサイズのファイルは FTP など別プロトコルでやり取りしたほうがよさそうです。 - 容量制限があるサーバではどのような設定が望ましいのでしょうか?
-
結論的にはかなりの余裕を持たせた設定をするのが無難です。
というのも このスクリプトでは 1 ファイルあたりの容量、保持ログ (ファイル) 数、総容量を設定できますが容量制限があるサーバにおいてはこれらの設定に注意する点があります。
[アップロード] ---> [ログ数・容量チェック] ---> [ログ落ち分は削除]
という順序でスクリプトは処理をしているので、例えば 50MB の制限が掛けられているアカウントで 1 ファイルあたりの最大容量を 50MB に設定すると、 1 ファイルめに 50MB をアップロードした場合、保持ログ数が 1 でも 2 ファイルめをアップロードできなくなってしまうことがあります。
これは、アップロード完了時までに 1 ファイルめが残っていることが原因となります。 2 ファイルめのアップロード開始と同時に 1 つめを消せば問題が無くなる様にも見えますがアップロード完了時までそれが正常に終わるかどうかは分かりません。 しかしながらその様な仕様にしたい場合はスクリプトをある程度改変することで可能になります。
また複数ユーザーからの同時 (並列) アップロード時も同様なので頻度が多いようなら誰かがアップロード時にはアップロードさせないようにするなどの工夫をした方が良いかもしれません。 - 拡張子 MP4 (大文字) を追加したのですが認識されません
- 拡張子 MP4 をアップロードすると小文字になってしまう
-
拡張子フィルターの処理順序の関係で $set{'up_ext'} に MP4 を追加するのみでは認識されません。これは元ファイル名拡張子を一旦小文字に変換した後に拡張子変換を掛けていることに因ります。以下の方法で回避することができます。
- $set{'up_ext'} (アップロードできる基本拡張子) に MP4 を追加
- $set{'change_ext'} (拡張子変換) に「mp4->MP4」を追加
最後に
このマニュアルは、同じく「Sn Uploader」の改造版である「Sn Uploader Candy Type 1」も参考にしました。