何年も前に作ったCGI用の自前ライブラリを使って作っていたアップローダーを
少し改変してみましたので羞恥プレイの一環天草発のオープンソースの一環として
ソースごと公開しようと思います。

※2014/03/07 includeがひとつ漏れてたのに後から気付いたので差し替えました。。。

はっきり言って糞コードと言われてもしょうがないようなコードです。。。

「CGIってPerlで書いてあるからソース晒さないと公開できないじゃん」
と思った方もおられると思いますが、このCGIはPerlではなくC言語で作ったものです。。。
なので、使用するにはsshなんかでシェルにログインしてgccでコンパイルする必要があります。
何故Perlじゃなくて、C言語だったかと言うと単純に私がC言語の方が使い慣れてるからです。
Perlを使い慣れているならPerlを使っていたでしょう。

サーバーサイドのWebプログラミングと言ったらPHPと言ってもいいくらい
PHPが普及していますが、今更CGIを公開しようとしたのは、
アップローダーという特性上、大きなファイルをアップロードする場合があるからです。

PHPでもアップローダーは作れますが、PHPにはそれぞれ
upload_max_filesizepost_max_sizememory_limit
といった設定値があり、その設定値は以下のようになっています。

memory_limitは、PHPが使用可能なメモリの最大サイズ。
post_max_sizeは、一回アップロードの最大サイズで、memory_limitより小さくないといけない。
upload_max_filesizeは、1つのファイルの最大サイズで、post_max_sizeより小さくないといけない。

これからもわかるようにアップロードするファイルをどうやらメモリに
すべて溜め込んでいるっぽい感じじゃないですか?
なので最大でもmemory_limitの値より小さいファイルしかアップロードできません。

memory_limitを増やすと大きなファイルもアップロードできるようになると思いますが、
サーバーへの負荷を考えると、いくらメモリが大きくなったとはいえ、数十MB程度ぐらいしか
使う気になりません。(まぁ、個人の気分次第だとは思いますがw)

そこで、CGIで大きなファイルを送ってもメモリを大量に使わないようなロジックを書けば
解決するわけです。
ようは送られてくるデータをメモリに溜め込まずにファイルに書き出すだけですけどね。

なので1GBとかのファイルも送信可能です。
2GB以上はブラウザによっては送信させてくれなかったり古いWebサーバーだとエラーになったりして
うまく送れない場合も多いですが(実際に2GB以上のファイル送信ができるのか試してませんw)

まぁ、そういう訳でわざわざCGIのアップローダーを作ってみたわけです(作ったのは何年も前ですが)
私が知らないだけで、PHPでも巨大ファイルの送信可能な方法があるのかもしれませんけどねw

ちなみにHTML以外にCSSとJavascriptも一応は使用していますが、
その辺はド素人なんでご了承くださいw

今後、JavascriptとかCSSは勉強する予定ですからw
勉強したら、アップロードとかそのあたりもajaxでやるように
改良するとナウくていいですよねw

ちなみにこれはWindowsのVC++でもコンパイルはできましたが、動作確認は自宅の
Linux環境でしかやっておりません。
また、動作も完璧な動作確認をしたわけではないので、バグが無い保証もありません。

サンプルとして設置したURLを貼りたい所ですが・・・
自宅サーバーのため、あまり晒したくないので、スクリーンショットで勘弁してくださいw
アップロード時にファイルのMD5ハッシュ値を計算するのでファイル破損のチェックもできますよ!
uploader-ss

Webについてあんまり詳しくないのに偉そうに語ってしまいました。。。
間違いはご遠慮なく指摘ください。

この記事の内容はいつも以上に自信がありませんwww

いつも自信満々のような書き方で書いていますが、自分のスキルには全く自信がありません。。。
色んな事に手を出しすぎてどれも中途半端ですからしょうがないんですけどw
キーワード: CGI C言語 Perl アップローダー
コメント(2件)
1   4GB以上は無理だこれ
cgilib.hを見ていて気付いた。
ファイルサイズの変数が符号なしの32ビットだから
およそ4GBまでしか扱えないですね。。。
unsigned long long に変ないと少なくとも無理だけど
そもそもそんなデカいファイルをWebでアップロードをする
ツワモノっているんですかね?w

・・・10年後はそんぐらい当たり前になってるかも。
管理人 2014年02月12日 01時20分32秒     
2   いけるかな?
unsigned long longに変更してみたけど
現在はテストできる環境がない。
VMwareで新しくテストできる環境作るかなぁ・・・
管理人 2014年02月12日 22時00分52秒     

 

■コメントを書く
タイトル
本文 *必須
お名前 *必須
メールアドレス
ホームページアドレス
削除パスワード*必須
コメントを削除する際に必要になります。
認証キー *必須 下の画像に表示されている数字をご記入下さい。
(画像は毎回変わります)