- - PR -
servlet:エクセルダウンロード
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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(); } =================================================== どなたかご教授頂けるよう宜しくお願い致します。 | ||||||||
|
投稿日時: 2004-09-13 04:50
sunfireさん、こんにちは。
原因とは関係ないかもしれませんが、
はまずいと思います。
のようにしないと、最後の端数の後にゴミがつきます。 | ||||||||
|
投稿日時: 2004-09-13 08:19
Kissingerさん、早速のご返答有難う御座います。
確かにご指摘の箇所につきましては、ゴミがついてしまう可能性が ありますので修正し、ためしてみようと思います。 アップロード前のエクセルファイルと、 ダウンロード後のエクセルファイルをテキストエディタで開いて比較しましたところ、 似てはおりましたが、一部のコードにて、違いがあることに気づきました。 ---------------------- 畚0⇒・ ---------------------- 等、 Mysqlのblob型に格納を行っているのですが、単純に格納を行って いるだけですので、その際にエスケープされているのかもしれません。 単純に格納するだけでは、やはりエスケープされてしまうのでしょうか。 | ||||||||
|
投稿日時: 2004-09-13 11:27
すいません。先程の内容逆でした。
---------------------- ・⇒畚0 ---------------------- 実際のDBへの格納データでも同様に「畚0」に変換?され格納されておりました。 | ||||||||
|
投稿日時: 2004-09-13 12:04
「ファイルのダウンロード」ダイアログさえもでないんですか??
| ||||||||
|
投稿日時: 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(); } } | ||||||||
|
投稿日時: 2004-09-13 13:46
mime-typeが設定されていないためではないでしょうか?
HTTPのレスポンスヘッダを出力する都合上、 ServletResponse#setContentType()やServletResponse#setHeader()は、 ServletResponse#getOutputStream()の取得の前に実行する必要があったと思います。 順番を変えてみてはどうでしょうか。 | ||||||||
|
投稿日時: 2004-09-13 14:07
このソースを見る限り、既にアップロードされたファイルをDBに格納しているようですね。 そのDB格納前のファイルが正常かどうか確認してみてはどうですか。そこで既にファイルが 正常でないならアップロードの問題ですね。 |