人に聞けない痔の悩み、これでスッキリ >>

jspに<a href="ファイル名">ダウンロード</a>
でそのファイルをダウンロードできると思ってましたが
ダウンロードすることができません。
下記の様にアドレスを指定して試行錯誤している状態です。。
<a href="./test.txt">1</a>
<a href="sample.csv">2</a>
<a href="C:\test.txt">3</a>
<a href="C:\\test.txt">4</a>
<a href="C:\sample.csv">5</a>
<a href="C:\\sample.csv">6</a>
<a href="./sample.csv">7</a>
<a href="C:/test.txt">8</a>
<a href="C://test.txt">9</a>
<a href="C:\Program Files\Tomcat 6.0\webapps\servlet\pages\sample.csv">10</a>
<a href="C:\Program Files\Tomcat 6.0\webapps\servlet\pages\sample.txt">11</a>
<a href="C:\\Program Files\Tomcat 6.0\webapps\servlet\pages\sample.csv">12</a>
<a href="C:\\Program Files\\Tomcat 6.0\\webapps\\servlet\\pages\\sample.csv">13</a>
ちなみにOSはwindows XPです。
どなたかファイルのダウンロードについてご存じの方はご教授ください。

A 回答 (2件)

これは、IEなどブラウザが、ファイルの種類を検知して、


勝手に開いてしまう動作なので、
本来的には対処しようがないです。

なんとかやろうとする場合、
○直接ファイルにリンクを張らない。
○ダウンロード用のサーブレット/JSPを作成する。
○リンクは、そのサーブレット/JSPを対象とし、
 パラメータでファイルを指定する。
○サーブレット/JSP側で指定されたファイルを読み込む。
○サーブレット/JSPが読み込んだデータをレスポンスする。
という修正が必要です。

このレスポンスするときに、いくつか属性をヘッダーに設定する必要があります。
(属性)Content-disposition
Content-disposition: attachment; filename=ファイル名
これでファイル・ダウンロードと認識させる。

http://www.tohoho-web.com/lng/b200005/00050035.htm
http://www.stackasterisk.jp/tech/java/download01 …

この回答への補足

ご回答ありがとうございました。
http://www.stackasterisk.jp/tech/java/download01 …のHPを
参考にプログラムを動かしてみたのですがファイルのダウンロードは
できるようになりました。しかし、ダウンロードするファイルが何故か
C:\Program Files\eclipseのディレクトリからとなってしまいます。
ダウンロードするファイルのディレクトリを自由に設定するには
どのようにすればよいのでしょうか。お忙しいところ申し訳けありません
がご回答いただけませんでしょうか。よろしくお願いいたします。

補足日時:2007/06/07 20:18
    • good
    • 0

うーんと明らかに指定の仕方が、ローカルでのパス指定ですね。


C:\とか。。
Webサーバーを利用している以上、物理的に同じマシンでも、ローカルのパスを利用しません。

そのJSPファイルからみて相対パス(./xxxx.txtとか)や、Webアプリケーションのルートから見たパス(/aaa/bbb/xxxx.txtとか)を指定しないといけません。

あと、テキストファイル、Officeファイルは、ダウンロード画面が表示されずにブラウザ上で開かれる場合があります(ネットワーク的にはダウンロードしているのですが、保存ダイアログが表示されない)

なので、
<a href="./test.txt">1</a>
<a href="sample.csv">2</a>
<a href="./sample.csv">7</a>
これらがどう動作しているのか?
JSPファイルと、対象のファイルの位置関係の補足をお願いします。

この回答への補足

ご回答ありがとうございました。ご指摘の点について補足します。
<a href="./test.txt">1</a>
<a href="sample.csv">2</a>
<a href="./sample.csv">7</a>
とするとダウンロード画面が表示されずにブラウザ上で開かれてしまいます。

JSPファイルと、ダウンロード対象のファイルの位置関係についてですが
JSPファイルを
C:\Program Files\Tomcat 6.0\webapps\servlet\pages\sample.jspに置きます。
ダウンロードしたいファイルを
C:\Program Files\\Tomcat 6.0\webapps\servlet\download\sample.csvと
C:\download\sample.csvに置きたいと考えています。

補足日時:2007/06/07 11:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJSPの処理の途中で、JavaScriptの処理をしたい

プログラムをJSPで記述している(<% %>タグ)のですが、
JavaScriptのalertやconfirmなどのポップアップするダイアログを
表示したいのです。それは可能なのでしょうか?

Aベストアンサー

No.2の回答に対する回答(変な日本語ですが)です。

JSPとJavaScriptの処理の行われる順番について考えていないと
エラーになることがありますよ。
大まかな流れは、
 JSPのソースをサーバ側で解釈、実行する(HTMLのソースを吐き出す)
  ↓
 クライアントに生成したソースを送信する
  ↓
 クライアント側のブラウザがソースを解釈する
  ↓
 ソースの中のJavaScriptを、ソースの上のほうから順次実行する
  ↓
 同時に、通常の表示(HTMLの解釈)も実行される

 と、こういう流れですので、例えば、JavaScriptで値を入力し、
JSPでその値を使おうとすると、エラーとなります。

 具体的にやりたいこと(やろうとしていること)を書いていただいたほうが
適切に回答できますが、上記が今考えられるエラーの原因です。

Qflush()とclose()について

Javaを独習Javaで独習しています。現在、入出力の所まできたのですが、Writerクラスのclose()とflush()の違いがわかりません。それぞれのメソッドの意味はわかるのですがそれらを使う目的がわかりません。flush()は「バッファ付けデータをそのストリームで表されている物理デバイスに書き込む」とあるのですが、サンプルには(バッファ付け文字ストリームの単元にも)flush()は一度も出てこずclose()のみで書き込みが行われています。探したのですが独習Javaのサンプルの中には結局flush()は一度も出てきませんでした。この二つの違いはなんなのでしょうか?初心者のためわかりにくい質問かとは思いますがよろしくお願いします。

Aベストアンサー

フラッシュすれば、ファイルやその他物理デバイスに強制的にバッファの内容が出力されるということは、理解されていると考えてよいですね?

で、なかなかストリームをクローズできない(またはしない)場合には、いつまで経ってもバッファの内容が物理デバイスに出力されないかも知れませんよね?でも、適当なタイミングで定期的にフラッシュすれば、その時点でバッファに溜まっている内容が物理デバイスに出力されます。

そのサンプルの場合は、書き出してすぐ?クローズしちゃうため、明示的なフラッシュは必要なかったんだと思いますが、

・フラッシュは、(ストリームを閉じずに)バッファの内容を強制的に物理デバイスに出力する。
・クローズは、(フラッシュされていなければフラッシュしてから)そのストリームを閉じる。

とまぁ、目的も内容も全然違うわけです。

QTomcatでのHTMLの表示

Tomcatで、HTMLファイルをwebappsディレクトリに作って、http://localhost8080/webapps/ファイル名.htmlというアドレスで表示しようとしたんですけど、HTTP404とエラー表示がされます。
http://localhost:8080にはアクセスできるんで、インストールは成功してると思うんですけど、何が原因なのでしょうか?

Aベストアンサー

#2です。。
記載しましたが、まったく間違った情報でした。すみません。
webapps/ROOTがデフォルトルートなので、そこに入れないと、http://localhost:8080/ファイル名.htmlには出来なかったですね。。

http://localhost8080/webapps/ファイル名.html
とするためには、TomcatのServer.xmlファイルに
<Context path="/webapps" workDir="フルパスディレクトリ" />
とか記載しないといけないかもしれません。

そのディレクトリに、ファイル名.htmlを配置になります。 間違った情報を掲載してしまいまして申し訳有りません。

Qjavascriptでセッションを取得

javaのsession.setAttribute()でセットした値をjavascriptで取得することは可能なのでしょうか?
可能であれば、手法を教えていただければと思います。
よろしくお願いします。

Aベストアンサー

セッションIDの保存はcookieかURLに連結する方法しか有りませんから、
JavaScriptでdocument.cookieや<a href="">を解析するなどしてセッションIDを取得することは可能だと思います。

セッションIDとセッションの値・内容との関連づけはサーバーで行われていますから、
その値を取得するにはAjaxなどで読み込むとかしないと無理だと思います。

Qリクエストに応じたselectedの初期値設定方法

リクエストに応じたOPTIONをselectedの初期値にする方法を教えて下さい。

java servletからjspを表示する際に、
setAttributeした値に応じてプルダウンの初期値に設定するにはどうしたら良いですか?

以下の様にDetail.jspに移動する前に、NOをセットしています。
普通に実行したら、YESで表示されてしまいます。
jsp側で何かを追記すれば良いと思うのですが、全然わかりません。。。

例)
[[[[[ShowDetail.java]]]]]
request.setAttribute("JAPAN", "NO");
request.getRequestDispatcher("/Detail.jsp")
.forward(request, response);

[[[[Detail.jsp]]]]
<form name="Japan">
<table border="1">
<tr>
<th>Japan</th>
<td>
<select name="Japan" id="Japan" >
<option value="YES">YES</option>
<option value="NO">NO</option>
<option value="KNOW">DON'T KNOW</option>
</select>
</td>
</tr>
</table>
</form>

リクエストに応じたOPTIONをselectedの初期値にする方法を教えて下さい。

java servletからjspを表示する際に、
setAttributeした値に応じてプルダウンの初期値に設定するにはどうしたら良いですか?

以下の様にDetail.jspに移動する前に、NOをセットしています。
普通に実行したら、YESで表示されてしまいます。
jsp側で何かを追記すれば良いと思うのですが、全然わかりません。。。

例)
[[[[[ShowDetail.java]]]]]
request.setAttribute("JAPAN", "NO");
request.getRequestDispatcher("/Detail.jsp")
.f...続きを読む

Aベストアンサー

こんにちは。

>普通に実行したら、YESで表示されてしまいます。
>jsp側で何かを追記すれば良いと思うのですが、全然わかりません。。。

あと、カテゴリがJavaScriptではなくJavaですね。

順に考えてみませんか。初期値を設定するには何が必要でしょうか。
今は何もしていないから一番上のYESが表示されています。
<option value="NO" selected="selected">とする必要がありますよね。
そうしたらそれを出力するようにJSPを記述すればいいわけです。

フレームワークを何も利用していなければ以下のようになると思います。

<%
// 例だとjapanにNOが入っている
String japan = (String)request.getAttribute ( "JAPAN" );
%>

<select>
<option value="YES"<%= "YES".equals(japan) ? " selected=\"selected\"" : ""; %>>YES</option>
<option value="NO"<%= "NO".equals(japan) ? " selected=\"selected\"" : ""; %>>NO</option>
<option value="KNOW"<%= "KNOW".equals(japan) ? " selected=\"selected\"" : ""; %>>KNOW</option>
</select>

各optionでどの文字列が入っているかによってselected="selected"を出力すれば良いです。

<%= "YES".equals(japan) ? " selected=\"selected\"" : ""; %>

上の記述は

if ( "YES".equals(japan) ) {
out.write ( " selected=\"selected\"");
} else {
out.write ( "" );
}
と同義です。
ようするにjapanにYESが入ってきたらselected="selected"を出力することにより初期選択項目とする。
NOが入ってくれば"YES".equals(japan)には該当しないので無出力、次の"NO".equals(japan)で該当するのでNOの<option>が初期値となります。

こんにちは。

>普通に実行したら、YESで表示されてしまいます。
>jsp側で何かを追記すれば良いと思うのですが、全然わかりません。。。

あと、カテゴリがJavaScriptではなくJavaですね。

順に考えてみませんか。初期値を設定するには何が必要でしょうか。
今は何もしていないから一番上のYESが表示されています。
<option value="NO" selected="selected">とする必要がありますよね。
そうしたらそれを出力するようにJSPを記述すればいいわけです。

フレームワークを何も利用していなければ以下のようになると...続きを読む

QonClickで関数呼出し後に、結果に応じてsubmitを実行する方法

JavaScriptで、
function func() {
 if (a==0) {
  alert("処理しない");
  return false;
 }
 return true;
}
と、a=0ならfalseを返し、それ以外ならtrueを返す関数を定義しています。

そして、FORMタグで
<FORM NAME="FormName" ACTION="next.html">
<INPUT TYPE="button" VALUE="next" NAME="button1" onClick="return func();submit();">
</FORM>
と記述しています。
要は、ボタンを押下した際にfunc関数がtrueを返せば、next.htmlに
遷移させたいのですが、上記記述では、遷移しません・・・
onClick部分にonClick="return func(),submit();"と記述した場合、
func関数の実行結果がtrueでもfalseでも遷移してしまいます。
そこで、なんとなくonClick="return func()&&submit();"と記述してみたところ、
func関数がtrueの時のみうまく遷移するようになりました。

これは偶然そう動作しているのでしょうか、それとも上記は正しい記述方法なのでしょうか?
正しい記述方法ならいいのですが、上記以外に正式な記述方法があれば
教えていただけないでしょうか?

※TYPE="submit"にすればいいとは思うのですが、buttonで実現したいと
考えております。

JavaScriptで、
function func() {
 if (a==0) {
  alert("処理しない");
  return false;
 }
 return true;
}
と、a=0ならfalseを返し、それ以外ならtrueを返す関数を定義しています。

そして、FORMタグで
<FORM NAME="FormName" ACTION="next.html">
<INPUT TYPE="button" VALUE="next" NAME="button1" onClick="return func();submit();">
</FORM>
と記述しています。
要は、ボタンを押下した際にfunc関数がtrueを返せば、next.htmlに
遷移させたいのですが、上記記述では、遷移しませ...続きを読む

Aベストアンサー

3つのパターンをみる限り、理由は以下の通りと思います。
1.セミコロン(;)で区切った場合、
この場合、「return func();」と「submit();」とは別の文です。returnはその時点の値を戻して、それ以降の動作を打ち切ってしまいます。よって、onClickイベントはfuncメソッドの戻り値(true/false関係なく)を戻して、そこで終了、それ以降のsubmitは実行しないとなります。

2.カンマ(,)で区切った場合、
この場合、「return func(),submit();」が1つの文となります。この「,」は、左右の式を評価して、右式を結果とする演算子です。よって、funcメソッド、submitメソッド両方を評価するため、funcメソッドの戻り値に関係なく、submitされます。

3.&&で区切った場合、
論理演算子「&&」は、左右ともにtrue(0以外)の場合のみtrueとする演算子です。また、2項論理演算子は左式から評価し、左式だけで全体の結果がわかる場合、右式を評価しません。よって、funcメソッドがfalseを戻した場合、その時点でsubmitを評価しなくても演算結果は必ずfalseとなるのでそこで打ち切られ、trueを戻した場合、submitを評価しないと演算結果を得られないため、遷移したわけです。「&&」を「||(論理和)」に変更すると逆の結果得たと思います。

さて、では3の「&&」が正しいかと言われたら、文法上は正しいです。ただし、他人がみてわかるとは思えません。
そこで、以下の記述はいかがでしょう。読んでみてソースを理解できますか。


<FORM NAME="FormName" ACTION="next.html">
<INPUT TYPE="button" VALUE="next" NAME="button1" onClick="func()">
</FORM>

(中略)

// funcの定義
function func() {
 if (a==0) {
  alert("処理しない");
  return ;
 }
 document.FormName.submit();
}

要は、ボタンを押されたら、funcを呼び出せ。
funcでは、aが0ならば、そこで終了しろ。
そうでなければ、documentオブジェクト内のFormNameと言う名前のオブジェクトのsubmitメソッドを呼べ。
です。

3つのパターンをみる限り、理由は以下の通りと思います。
1.セミコロン(;)で区切った場合、
この場合、「return func();」と「submit();」とは別の文です。returnはその時点の値を戻して、それ以降の動作を打ち切ってしまいます。よって、onClickイベントはfuncメソッドの戻り値(true/false関係なく)を戻して、そこで終了、それ以降のsubmitは実行しないとなります。

2.カンマ(,)で区切った場合、
この場合、「return func(),submit();」が1つの文となります。この「,」は、左右の式を評価して、右...続きを読む

Qラジオボタンの選択肢をサーブレットで取得するには?

サーブレットの開発を行っていますが、ブラウザー側で
ラジオボタンを選択した際に何を選択したかのデータを取得したいのです。
(下記のHTMLで言えば、割引手形か、手形貸付か、証書貸付というのを取得したいのです)
パラメーターをサーブレットで受け取りたいのですが
うまくいきません
HTMLでHIDDENを使用するとか聞いたことはあるのですがどのようにコーディングすればいいんでしょうか?
よろしくお願いいたします。

<p>
<input type="radio" name="radiobutton" value="radiobutton">
割引手形 
<input type="radio" name="radiobutton" value="radiobutton">
手形貸付 
<input type="radio" name="radiobutton" value="radiobutton">
証書貸付
</p>

ブラウザー側からは
<form action="http://localhost/servlet/yuushi" method=post>
の指定を行っています。
サーブレットでの受け取り方を、
String p2=request.getParameter("radiobutton");
 とすると、p2=radiobuttonとデータがセットされました。

サーブレットの開発を行っていますが、ブラウザー側で
ラジオボタンを選択した際に何を選択したかのデータを取得したいのです。
(下記のHTMLで言えば、割引手形か、手形貸付か、証書貸付というのを取得したいのです)
パラメーターをサーブレットで受け取りたいのですが
うまくいきません
HTMLでHIDDENを使用するとか聞いたことはあるのですがどのようにコーディングすればいいんでしょうか?
よろしくお願いいたします。

<p>
<input type="radio" name="radiobutton" value="...続きを読む

Aベストアンサー

それぞれの項目の value を、ユニークにして下さい。例えば、

<input type="radio" name="radiobutton" value="1"> 割引手形 
<input type="radio" name="radiobutton" value="2"> 手形貸付 
<input type="radio" name="radiobutton" value="3"> 証書貸付

そうすれば、「手形貸付」を選択したときに

String p2 = request.getParameter("radiobutton");

とすれば、p2 は "2" になります。

QExcelファイルをダウンロード

Webページ上のあるボタンを押した時、サーバー上にExcelファイルを作成し、そのファイルをそのままクライアントにダウンロードするプログラムをつくろうとしています。その時、ダウンロードダイアログを表示させ、クライアントが任意の場所に保存できるようにしようと思っています。とりあえずファイルをダウンロードするクラスを下記のように作りました。
public class download {
public static final int EOF=-1;
public void downloader(HttpServletResponse res){
try {
String fileName = "testExcel1.xls";
String CONTENT_TYPE = "application/atom";

res.setContentType(CONTENT_TYPE);
res.setHeader("Content-Disposition", "filename=\""+ fileName +"\"");
URL urlObj=new URL("サーバーアドレス:8080/DB/testExcel.xls");
InputStream in = urlObj.openStream();
FileOutputStream(new File("testExcel1.xls"));
BufferedOutputStream bout= new BufferedOutputStream(res.getOutputStream());
int c;
while( (c = in.read()) != EOF ) {
bout.write(c);
}
bout.flush();
in.close();
} catch (Exception e ) {
e.printStackTrace();
}
}
}
このまま実行するとダウンロードダイアログは表示されず、Excelファイルの内容がクライアントのブラウザ上に表示されてしまします。どうしたらダウンロードダイアログが表示されるようになるでしょうか。アドバイスよろしくお願いします。

Webページ上のあるボタンを押した時、サーバー上にExcelファイルを作成し、そのファイルをそのままクライアントにダウンロードするプログラムをつくろうとしています。その時、ダウンロードダイアログを表示させ、クライアントが任意の場所に保存できるようにしようと思っています。とりあえずファイルをダウンロードするクラスを下記のように作りました。
public class download {
public static final int EOF=-1;
public void downloader(HttpServletResponse res){
try {
S...続きを読む

Aベストアンサー

setHeader の filename の前に attachment; を付けてみてはどうですか?

res.setHeader("Content-Disposition", "attachment; filename=\""+ fileName +"\"");

QHTMLのソースをエクセルに貼り付ける方法

HTMLのソースを、そのまま(メモ帳表示データのまま)Excelに貼り付ける方法はありますか。

メモ帳でソースの表示をして、全て選択→コピー→Excelに型式を選択して貼り付け→テキスト
で貼り付けてみましたが、変なフォーマットで表示されます。
セルの書式を文字列にしても同じです。

目的はExcelの文字列操作で特定の文字だけ拾い出して加工しようと考えています。
OS:Win95、Excel2000です。

Aベストアンサー

再び登場です。
ソースを表示させたメモ帳をとりあえず一度名前を付けて保存して下さい。
そしてExcelのデータメニューから外部データの取り込み、テキストファイルのインポートをクリック。
後は必要に応じて取り込み方を選びます。
これでどうでしょうか?

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む


人気Q&Aランキング