- PR -

servlet:エクセルダウンロード

投稿者投稿内容
sunfire
会議室デビュー日: 2004/09/13
投稿数: 7
投稿日時: 2004-09-13 03:08
はじめまして。sunfireと申します。
javaWebアプリ開発の初心者です。servlet、jspを使用しております。
宜しくお願い致します。

エクセルファイルのをアップロード・DBに格納し、
DBから取得して、ダウンロードを行いたいのですが、
うまく表示ず、困っております。テキストファイルは表示されるのですが。

【環境】
windows2000
tomcat4
mysql
jdk1.4


CONTENT_TYPEでは、エクセルを指定しておりますが、
テキストは表示できてエクセルが表示できません。
DB格納時に問題があるのでしょうか。

以下、表示する際のソース抜粋です。
==================================================================

public void service(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

RequestDispatcher rd = null;

String ID = request.getParameter("id");

ServletOutputStream output = response.getOutputStream();
try {
Connection cn = null;
TransactionBean trans = new TransactionBean();
cn = trans.getJdbcConnection();

Statement st = cn.createStatement();

String qry =
"SELECT FILEDATA FROM FILE_INFO WHERE FILEID='" + ID + "'";

//問い合わせ
ResultSet rs = st.executeQuery(qry);
//検索結果取り出し
if (!rs.next()) {
return;
}

Blob blob = rs.getBlob(1);

//接続のクローズ
rs.close();
st.close();
cn.close();

int len = (int)blob.length();
byte[] buffer = new byte[len];
InputStream inputstream = blob.getBinaryStream();
String CONTENT_TYPE = "application/vnd.ms-excel; charset=Shift_JIS";
response.setContentType(CONTENT_TYPE);
response.setHeader("Content-Disposition", "attachment;filename=\\""+ filename +"\\"");

while (inputstream.read(buffer,0,len)!=-1){
output.write(buffer);
}
output.flush();
output.close();
inputstream.close();
return;

} catch (Exception e) {
 e.printStackTrace();
}

===================================================

どなたかご教授頂けるよう宜しくお願い致します。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-09-13 04:50
sunfireさん、こんにちは。

原因とは関係ないかもしれませんが、
コード:
while (inputstream.read(buffer,0,len)!=-1){
	output.write(buffer);
}



はまずいと思います。
コード:
int length = 0;
while ((length = inputstream.read(buffer, 0, len)) != -1) {
	output.write(buffer, 0, length);
}


のようにしないと、最後の端数の後にゴミがつきます。
sunfire
会議室デビュー日: 2004/09/13
投稿数: 7
投稿日時: 2004-09-13 08:19
Kissingerさん、早速のご返答有難う御座います。

確かにご指摘の箇所につきましては、ゴミがついてしまう可能性が
ありますので修正し、ためしてみようと思います。

アップロード前のエクセルファイルと、
ダウンロード後のエクセルファイルをテキストエディタで開いて比較しましたところ、
似てはおりましたが、一部のコードにて、違いがあることに気づきました。
----------------------
畚0⇒・
----------------------
等、
Mysqlのblob型に格納を行っているのですが、単純に格納を行って
いるだけですので、その際にエスケープされているのかもしれません。
単純に格納するだけでは、やはりエスケープされてしまうのでしょうか。
sunfire
会議室デビュー日: 2004/09/13
投稿数: 7
投稿日時: 2004-09-13 11:27
すいません。先程の内容逆でした。
----------------------
・⇒畚0
----------------------

実際のDBへの格納データでも同様に「畚0」に変換?され格納されておりました。
わんこ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 46
投稿日時: 2004-09-13 12:04
「ファイルのダウンロード」ダイアログさえもでないんですか??
sunfire
会議室デビュー日: 2004/09/13
投稿数: 7
投稿日時: 2004-09-13 13:28
お返事ありがとうございます。

ダイアログは表示されています。
ただ、アップロード前のファイルと
DBへの格納データを比較したとき、一部文字コードがエスケープされて、
変換されて格納されていおりました。
そのため、ダウンロードファイルも開こうとするとエラーが出てしまっています。
現象としては、DBへのSQL実行時にエスケープされているようですが・・・

下記はバイナリデータのDB格納ソースです。

public void service(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

RequestDispatcher rd = null;

String filename = new String(request.getParameter("filename"));
String fileno = "1";

File file = new File(filename);
long fileLength = file.length();
int fLength = (int) fileLength;

InputStream fin = new FileInputStream(filename);

Connection cn = null;
TransactionBean trans = new TransactionBean();
// トランザクション開始
// データベース接続呼び出し
cn = trans.getJdbcConnection();

//insertの準備
String qry =
("INSERT INTO FILE_INFO(FILENO,FILENAME,FILEDATA,) VALUES('"
+ fileno
+ "','"
+ filename
+ "',?,'"
+ "')");
PreparedStatement st = cn.prepareStatement(qry);
st.setBinaryStream(1, fin, fLength);

//実行
int num = st.executeUpdate();

//接続のクローズ
st.close();
cn.close();

rd = ctx.getRequestDispatcher("/file.jsp");
// 画面を表示
rd.forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2004-09-13 13:46
mime-typeが設定されていないためではないでしょうか?

HTTPのレスポンスヘッダを出力する都合上、
ServletResponse#setContentType()やServletResponse#setHeader()は、
ServletResponse#getOutputStream()の取得の前に実行する必要があったと思います。
順番を変えてみてはどうでしょうか。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-13 14:07
引用:

sunfireさんの書き込み (2004-09-13 13:28) より:
下記はバイナリデータのDB格納ソースです。


このソースを見る限り、既にアップロードされたファイルをDBに格納しているようですね。
そのDB格納前のファイルが正常かどうか確認してみてはどうですか。そこで既にファイルが
正常でないならアップロードの問題ですね。

スキルアップ/キャリアアップ(JOB@IT)