何年も前に作った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_filesize、post_max_size、memory_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