%@ page import="java.io.*" %><%@ page import="java.util.*" %><%@ page import="java.text.*" %><%@ page import="javax.imageio.*" %><%@ page import="java.awt.image.BufferedImage" %><% //************************************************************************* /** * 画像一覧作成JSP ver.2a * 配置された画像と同じフォルダにある画像の一覧を作成します。 * 画像ファイルがBMPの場合に、JPEGに変換して表示するオプション機能があります。 * (この画像の変換は、J2SE1.5におけるImageIOパッケージの追加機能使用しています) * * 使用方法: * このファイルの拡張子を".jsp"に変更し、画像を格納するフォルダに配置します。 * 画像フォルダは、サーブレットコンテナの配下にある必要があります。 * カスタマイズ: * 少しですがカスタマイズ用のパラメタがあります。 * 少し下のほうの「カスタマイズ項目」のブロックの変数を制御します。 * * 全般的な設定を行います。 * ACCEPT_RE_PATTERN * 画像を現すファイル名に合致する正規表現を指定します。 * ファイル名は、すべて小文字に変換してからチェックされます。 * デフォルトでは、BMP,JPEG,GIF,PNGが対象になります。 * ENABLE_SORT_OPTION * true にするとソートメニューを表示します。 * false にすると、ファイル一覧のみ表示します。 * * 以下の項目は、一覧表示時にも使用します。 * デフォルト設定を、規定の定数値以外に変更した場合は、ファイル名の昇順で表示されます。 * SORT_FIELD_DEFAULT * ソート項目を、ファイル名(SORT_FIELD_BY_NAME)か、 * ファイルの更新日付(SORT_FIELD_BY_DATE)のどちらを使用するか選択します。 * SORT_ORDER_DEFAULT * ソート方向を昇順(SORT_ORDER_BY_ASC)か、降順(SORT_ORDER_BY_DESC)の * どちらにするかを選択します。 * * 確認環境: * WindowsXpSp2, Tomcat5.5.17, JavaSE1.5.09 * * ご注意: * このファイルは、ダウンロードして自由に使用・カスタマイズしていただいて構いませんが、 * ご使用の中で発生するいかなる問題・障害に対しても、公開者がなんら保障を行うことは * ありません。すべて使用される方の責任において、使用ください。 * なお、使用に当たっては、この「ご注意」「著作・制作」ブロックを削除・改変せず、 * また、当初の制作範囲を明示することを条件に、いかなる修正を行っていただいても結構です。 * 著作・制作: * MINyProjects 2006, http://www.minyprojects.com/waltraute/ ※URLは変わる場合があります。 */ %><%! // 定数宣言 /** ソート項目をファイル名にする */ private static final int SORT_FIELD_BY_NAME = 1; /** ソート項目をファイル更新日付にする */ private static final int SORT_FIELD_BY_DATE = 2; /** ソート方向を昇順にする */ private static final int SORT_ORDER_BY_ASC = 1; /** ソート方向を昇順にする */ private static final int SORT_ORDER_BY_DESC = 2; /* * カスタマイズ項目 */ /** 一覧で許容するファイル名パターンの正規表現 */ public static final String ACCEPT_RE_PATTERN = "^.*\\.(bmp|jpg|jpeg|gif|png)$"; /** ソートオプションを表示する場合にtrue */ public static final boolean ENABLE_SORT_OPTION = true; /** ソート項目のデフォルト値を設定 */ public static final int SORT_FIELD_DEFAULT = SORT_FIELD_BY_DATE; // ファイル更新日付 public static final int SORT_ORDER_DEFAULT = SORT_ORDER_BY_DESC; // 降順 /** * 指定数値を3桁ごとのカンマ区切りの文字列にする。 * @param value 処理対象の数値 * @return 引数の数値を3桁ごとにカンマ区切りにした文字列 */ private String commaDelimited(long value){ String val_ = "" + value; int num = val_.length() / 3; int opt = val_.length() - num * 3; StringBuffer ret_ = new StringBuffer(val_.substring(0, opt)); for(int i = 0 ; i < num ; i ++){ if(ret_.length() > 0){ ret_.append(","); } ret_.append(val_.substring(i * 3 + opt, (i + 1) * 3 + opt)); } return ret_.toString(); } /** * 指定日付を日時フォーマットで出力する。 * @param stamp 処理したい日付 * @return 引数の日付を"yyyy-MM-dd HH:mm:ss"のフォーマットで編集した文字列 */ private String formattedTimestamp(Date stamp){ SimpleDateFormat sdf_ = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf_.format(stamp); } /** * BMPファイルをJPEGに変換する。 * @param bmpfile 変換対象のBMPファイル * @param outstream JPEGデータを出力する出力ストリーム */ private void convertBmpToJpeg(File bmpfile, OutputStream outstream) throws IOException { ImageIO.write(ImageIO.read(bmpfile), "JPEG", outstream); } //*****************************************************************************// %><% // パス解決など String srvpath_ = request.getRequestURI().substring(request.getContextPath().length(), request.getRequestURI().lastIndexOf("/") + 1); String dirpath_ = request.getRequestURI().substring(0, request.getRequestURI().lastIndexOf("/") + 1); String docbase_ = application.getRealPath(srvpath_); File folderpath_ = new File(docbase_); String imagefile_ = request.getParameter("file"); String convmode_ = request.getParameter("mode"); imagefile_ = (imagefile_ == null) ? "" : imagefile_.trim(); int idx = imagefile_.lastIndexOf("\\"); if(idx < 0){ idx = imagefile_.lastIndexOf("/"); } if(idx >= 0){ imagefile_ = imagefile_.substring(idx + 1); } convmode_ = (convmode_ == null) ? "" : convmode_.trim().toUpperCase(); File tgfile_ = new File(folderpath_ + File.separator + imagefile_); String tgLowerFilename_ = tgfile_.getName().toLowerCase(); // ファイルダウンロード処理: // 指定ファイルが存在している場合で、かつ、そのファイル名が // アクセスパターンに合致しているかどうかのチェック if(tgfile_.exists() && tgfile_.isFile() && tgLowerFilename_.matches(ACCEPT_RE_PATTERN)){ // BMP → JPEG 変換 if(tgLowerFilename_.endsWith(".bmp") && convmode_.equals("B2J")){ // 変数宣言など OutputStream ops_ = new BufferedOutputStream(response.getOutputStream()); // コンテキストヘッダを指定 response.setContentType("image/jpeg"); response.setHeader("Content-Disposition", "inline; filename=" + tgfile_.getName()); // BMPからJPEGに変換してダウンロード convertBmpToJpeg(tgfile_, ops_); // 出力をフラッシュ ops_.flush(); } // そのままダウンロード else{ // 変数宣言など String fileext_ = imagefile_.substring(imagefile_.lastIndexOf(".") + 1).toLowerCase(); InputStream ips_ = new BufferedInputStream(new FileInputStream(tgfile_)); OutputStream ops_ = new BufferedOutputStream(response.getOutputStream()); // コンテキストヘッダを指定 response.setContentType("image/" + fileext_); response.setHeader("Content-Disposition", "inline; filename=" + tgfile_.getName()); byte[] buff_ = new byte[1024]; int siz; while((siz = ips_.read(buff_)) >= 0){ ops_.write(buff_, 0, siz); } // 出力をフラッシュ ops_.flush(); } } // 一覧を表示 else { %><%@ page contentType="text/html; charset=MS932" %>
file name | last modified | size [byte] | converted download |
---|---|---|---|
<%= tmp_.getName() %> | <%= formattedTimestamp(new Date(tmp_.lastModified())) %> | <%= commaDelimited(tmp_.length()) %> | <% // 拡張子によるファイルフォーマット変換 String filename_ = tmp_.getName().toUpperCase(); // BMPからJPEGへの変換 if(filename_.endsWith("BMP")){ %> JPEG <% } // else { ... // } %> |