- PR -

JSPでダウンロード機能を実装したいのですが。

投稿者投稿内容
naito
常連さん
会議室デビュー日: 2007/08/07
投稿数: 36
投稿日時: 2007-08-07 15:50
はじめまして。

現在、JSPを使って、csv形式のファイルをダウンロードさせる機能を作成しているのですが、DBから情報をもってくるまえに、まずは簡単にcsvファイルがダウンロードできるのか試しているのですが、以下のようなコードでは、ダウンロード後、確認してみると、トップに余白ができてしまいます。この余白を消して先頭から表示されるようにするにはどうすればいいのか是非御教授願います。
よろしくお願いします。

以下、コード。

<%@ page import="java.io.*, java.util.*, java.sql.*, javax.sql.*, javax.naming.*" %>

<%
response.setContentType("application/comma separated value");
response.setHeader("Content-Disposition", "attachment;filename=kibou.csv");
out.println("a,b,c,d");
%>


ダウンロード後、表示結果

//何行かの余白ができる





a,b,c,d
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-08-07 16:10
出力されたソースを確認することはしましたか?
先頭に出力されている空行の数と
JSPの%>〜<%の数に関連性があることが見えて来ます。

出力しているものがHTMLならば<HTML>の前に空行がいくつあろうが
ブラウザ上への表示に何の影響もありませんが
今回のケースはHTMLではないのでソースに出力されている空行が
そのまま素直に表示されています。

問題点は、結果のJSPとダウンロード機能を同じJSPで行おうとしているため
結果のJSPがHTMLになっていない、という点です。
結果とダウンロードは別々に実装しましょう。
naito
常連さん
会議室デビュー日: 2007/08/07
投稿数: 36
投稿日時: 2007-08-07 16:36
あすか様、早い返信ありがとうございます。

ソースは先ほど書いたコードのみです。
特に何も出力されることを望んではいません。

試しにソースの一番先頭でout.prinlnをしてみましたが、それでもダウンロードしたcsvファイルの先頭に余白が8行ほどできてしまいました。

他に何か原因があるならば教えていただきたいです。
よろしくお願いいたします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-08-07 16:58
jspでは<%%>で囲まれていない部分はHTMLだとみなされるので、そこの余計な改行が入ってるからだと、あすか氏はおっしゃてると思います。
例えば以下のようなコードにすると、CSVに"test"って文字が含まれますよね?
それと同じ理由でJSP内の改行もCSVに含まれます。(多分。。。)


<%@ page import="java.io.*, java.util.*, java.sql.*, javax.sql.*, javax.naming.*" %>

test

<%
response.setContentType("application/comma separated value");
response.setHeader("Content-Disposition", "attachment;filename=kibou.csv");
out.println("a,b,c,d");
%>
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-08-07 16:59
引用:

naitoさんの書き込み (2007-08-07 16:36) より:
試しにソースの一番先頭でout.prinlnをしてみましたが、それでもダウンロードしたcsvファイルの先頭に余白が8行ほどできてしまいました。


<%@ page import〜>等の行は空白行として出力されますし、
スクリプトレット以外の空白行も同様に出力されます。

<%@ page import〜><%
Javaのコード
%>
というように先頭行に連続して書けば空白行は無くなりますが、
一番いいのはJSPを使わない事です。

CSVを出力するのにJSPである必要はありますか?
Servletを作るなりすればそんな事を考える必要も無くなります。
naito
常連さん
会議室デビュー日: 2007/08/07
投稿数: 36
投稿日時: 2007-08-07 17:13
burton999様、あしゅ様、返答ありがとうございます。

すこし解釈を間違っていました。申し訳ありません。
たしかにダウンロード機能では、表示することが目的ではないので、基本的にJSPで実装するよりもサーブレットのほうが早いですね。

返答を参考にし、JSPの一番先頭に、以下のように

<% out.println("a,b,c,d"); %>
<%@ import・・・%>

のように先頭に埋め込んでみたのですが、それでも結果は8行程度の余白でした。
サーブレットで作ってみようと思いますが、どうもこれが少し気になります。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-08-07 17:23
こんな風に書いてはいかが?
-------
<%@ page ....%><%
out.println("a,b,c,d"); %>
-------
naito
常連さん
会議室デビュー日: 2007/08/07
投稿数: 36
投稿日時: 2007-08-07 17:29
インギ様、返答ありがとうございます。

同じように試してみましたが、どうも余白が消えないようです。
コード上にはどうみてもout.printの前に改行、余白などはないのですが・・・。

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