M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2007年11月11日 01:34

オンラインでEPS他のファイルを閲覧できるサービスをお手軽に作る

このエントリーをはてなブックマークに追加 mixiチェック

オンラインで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>

テスト不足でした。すみません。

投稿 大野 義貴 [Perl] | |

トラックバック(1)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2279

CGI BOY 入門とperlの基礎を学びましょう - CGI BOY 入門とperlの基礎を学びましょう (2007年11月19日 06:53)

cgi入門をperlとPHPで作成しました。 続きを読む

コメントする