Main Contents
ファイルアップロードの罠
お昼頃、「画像がアップ出来ないんだけど」というクライアントさんからのお問い合わせ。
ちゃんとテストしたのになと思いつつ、こちらからはアップできることを確認。
でも、「できないんですよ」とのお答え。
よく調べてみると、Windows の IE からはアップできない事を確認。Safari からは OKだったのに。。。
ソースとにらめっこしていると、 form タグの enctype が、 multipart/form-data でなくてはいけないのに、 application/form-data になっているのをはっけん(自爆)
そりゃアップできないわ。。でも、Safariってこれでもアップできちゃうのね。。
あと、画像の縦横サイズ取得のために、 InputStream#mark(0) して、ImageInputStream を取得し、 ImageReader から width と height を取得した後、 InputStream#reset() して、ファイルをアップロードしています。
でも、画像のサイズが大きいと、 InputStream#mark(0) not support って例外が発生するケースを発見。
この辺どうにかしなきゃな。。
以下、そのあたりのコードです。
public ILargeObjectImage add(InputStream inputStream,
ILargeObjectImage iLobj) throws SQLException {
Connection conn = getDataSource().getConnection();
conn.setAutoCommit(false);
int oid = 0;
if (iLobj.getContentType() != null) {
if (iLobj.getContentType().equals("image/pjpeg")) {
iLobj.setContentType("image/jpeg");
}
Iterator iter = ImageIO.getImageReadersByMIMEType(iLobj
.getContentType());
if (iter.hasNext()) {
ImageReader reader = (ImageReader) iter.next();
try {
inputStream.mark(0);
ImageInputStream iis = ImageIO
.createImageInputStream(inputStream);
reader.setInput(iis, true);
iLobj.setWidth(new Integer(reader.getWidth(0)));
iLobj.setHeight(new Integer(reader.getHeight(0)));
inputStream.reset();
} catch (IOException e) {
conn.rollback();
throw new SQLException(e.getMessage());
}
}
}
try {
long image_id = SQLOptions.getNextId(conn, getSequenceName());
iLobj.setImageId(new Long(image_id));
iLobj.setFlags(Boolean.TRUE);
oid = addLargeObject(conn, inputStream);
iLobj.setOid(new Integer(oid));
addMaster(conn, iLobj);
conn.commit();
return iLobj;
} catch (SQLException e) {
conn.rollback();
throw e;
} finally {
DbUtils.close(conn);
}
}
もうちょっとリファクタリングしたいな。。ていうか、仕事しよ(汗)
- by みそ
- at 2005年10月28日 01:01
- in Java
-
TrackBacks
トラックバックURL:
Comments
Post a comment
(Think Different. では不適切なコメントを防止するため、コメントを掲載する前に管理者がコメントの内容を確認しています。コメントを初めて投稿する場合すぐに掲載されませんが、管理者が適切なコメントと判断した場合コメントは直ちに表示されますので、再度コメントを投稿する必要はありません。)
This weblog is licensed under a Creative Commons License.
これ最高!
どんどんUPしてください。