オンラインでEPS他のファイルを閲覧できるサービスをお手軽に作る
スポンサードリンク
オンラインでEPSファイルを閲覧できるサービス -EPS Viewer | コリス [coliss.com]
EPS Viewerは、ローカルにあるEPSファイルをアップロードして閲覧できるオンラインサービスです。
この手のやつはPerlのImage::Magick使ってお手軽に作れます。
filename: imageview.cgi
#!/usr/bin/perl use strict; use warnings; use CGI; use Image::Magick; my $q = CGI->new(); if ( $q->upload('file') ) { # ファイルアップロード時 my $fh = $q->upload('file'); my $temp = $q->tmpFileName($fh); my $image = Image::Magick->new; $image->Read($temp, filename => 'dummy',) or die; print $q->header( -type => 'image/png',); binmode STDOUT; $image->Write('png:-'); undef $image; exit; } else { # クエリー無し:通常表示 print $q->header( -type => 'text/html',); print <<"END_OF_HTML"; <html> <body> <form method="post" action="" enctype="multipart/form-data"> <label for="file">image file:</label> <input type="file" name="file" id="file" /> <input type="submit" /> </form> </body> </html> END_OF_HTML exit; }
実装例:http://imageview.dtpwiki.jp/
Image::Magickが対応している画像ファイルだったら表示できるようになっていますがエラー処理いい加減ですのであしからず。
今回のプログラムのキモは、Image::Magickは、$image->Readで食わせるファイル名の拡張子を見て読み込みファイルのファイルフォーマットを認識しますので、今回はアップローダのテンポラリファイル「CGItempxxxxx」(xは数字)ていうテンポラリファイルを食わせているので、拡張子がないので$image->Read($temp);だと失敗します。なので、ちゃんと、ファイルのフォーマットを伝えるため、$image->Read($temp, filename =>'.jpg');などとすると、JPEGと認識してくれます。プログラムでは、単純に送信されたファイルのファイル名を入れています。送信したファイル名を取得するには、<a href="http://blog.dtpwiki.jp/dtp/2006/07/cgipmupload_5b5f.html">M.C.P.C.: CGI.pmのuploadメソッドでファイル名取得したらフルパスからファイル名を取り出す処理を入れる</a>で取り上げたとおり、File::Basenameモジュールのfileparseメソッドを使いましょう。かえってアップロードされたファイル名をfilenameに入れるとダメみたい。単純に'dummy'を入れることに。
~~~
こんな感じでできちゃうわけですけれども、実運用で現場で使われている200MBとか300MBとかのやつをポイポイ投げられたらかなわないんで、公開するにはリソースが必要なんですよねー
(2007.11.11 1.52訂正)
<del>今回のプログラムのキモは、Image::Magickは、$image->Readで食わせるファイル名の拡張子を見て読み込みファイルのファイルフォーマットを認識しますので、今回はアップローダのテンポラリファイル「CGItempxxxxx」(xは数字)ていうテンポラリファイルを食わせているので、拡張子がないので$image->Read($temp);だと失敗します。なので、ちゃんと、ファイルのフォーマットを伝えるため、$image->Read($temp, filename =>'.jpg');などとすると、JPEGと認識してくれます。プログラムでは、単純に送信されたファイルのファイル名を入れています。送信したファイル名を取得するには、<a href="http://blog.dtpwiki.jp/dtp/2006/07/cgipmupload_5b5f.html">M.C.P.C.: CGI.pmのuploadメソッドでファイル名取得したらフルパスからファイル名を取り出す処理を入れる</a>で取り上げたとおり、File::Basenameモジュールのfileparseメソッドを使いましょう。</del><ins>かえってアップロードされたファイル名をfilenameに入れるとダメみたい。単純に'dummy'を入れることに。</ins>
テスト不足でした。すみません。
スポンサードリンク
コメントする