質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

6909閲覧

サーバにあるファイルを、そのままダウンロードさせたい

tohmey

総合スコア10

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2019/11/12 08:16

編集2019/11/13 00:07

すっごい単純なんですが、どうにも参考資料が見つからないのです。

FileクラスとかPathクラスで指定したファイルを、
そのままResponseに乗せて、
ブラウザのウインドウからダウンロードさせる(またはダウンロードフォルダに入れる)。

Byteに分解して乗せればいいのかな???

いちいちBeanオブジェクトみたいなものに取り込んだりしないで、
ファイルをそのまんま(取り込まずに)ダウンロードさせたいのですが。

よろしくお願いします。

ファイルの形式はCSVとEXCELです。
でも、他の形式のものも同じように扱えるように作ってしまいたいと思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/11/12 09:07 編集

まず思うように組んでみては。 単純ダウンロードのサンプルコードは探せば転がってるように思います。 それにファイルも種類がたくさんあります。ものによっても手法は異なってくることもあります。 念のため対象のファイルについても明記してください
tohmey

2019/11/13 00:13

追記しました。 でも、追記にあるように、ファイルの種別に関係なくダウンロードできるメソッドを、Utirityクラスに追加したいと思っています。 単純ダウンロードでも、やはり、ファイルの種別によって処理を変えなければならないのですね。 ちょうどピッタリのいいサンプルが見つからず、 いくつかの参考サイトのソースを組み合わせて四苦八苦しているなかでの質問でした。 ダウンロード仕組みを根本的に理解していないのが問題なのだと思います。
guest

回答2

0

自己解決

コントローラからfileDL(File file)に引数を渡してリターンするだけで、ダウンロードできるようになりました。

java

1@Component 2public class DownloadHelper { 3 private static final String CONTENT_DISPOSITION_FORMAT 4 = "attachment; filename=\"%s\"; filename*=UTF-8''%s"; 5 6 public void addContentDisposition(HttpHeaders headers, String fileName) 7 throws UnsupportedEncodingException { 8 headers.add(HttpHeaders.CONTENT_DISPOSITION, 9 String.format(CONTENT_DISPOSITION_FORMAT, 10 fileName, UriUtils.encode(fileName, StandardCharsets.UTF_8.name()))); 11 } 12 13 public ResponseEntity<byte[]> fileDL(File file) throws Exception { 14 HttpHeaders headers = new HttpHeaders(); 15 addContentDisposition(headers, file.getName()); 16 try (FileInputStream inputStream = new FileInputStream(file)) { 17 return new ResponseEntity<>(IOUtils.toByteArray(inputStream), headers, HttpStatus.OK); 18 } catch(Exception e) { 19 return new ResponseEntity<>("error end".getBytes(), headers, HttpStatus.OK); 20 } 21 } 22}

思っていたよりコントローラ周りがキレイに収まったので、ありがたいです。

投稿2019/11/13 01:10

tohmey

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

HTTPレスポンスのフィールド、Content-Type:Content-Disposition:について調べてみてください。これらのフィールドに適切に値をセットし、バイトデータをHTTPレスポンスのコンテントボディ部にセットして返せば、ブラウザー側でファイルとしてダウンロードできたり、ビューアーが起動できたりします。HTTPレスポンスへの載せ方は言語やフレームワークによって異なりますので、質問者さんの環境に合わせてください。

例:
Content-Type: application/octet-stream
Content-Disposition: attachment
Content-Type: image/png
Content-Disposition: attachment; filename="picture.png"
等々。

投稿2019/11/12 08:41

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tohmey

2019/11/12 08:46

ありがとうございます! 早速調べてみます。
dodox86

2019/11/12 08:50

関連する質問回答はこのteratailでも過去、何度かやり取りされているので、覗いてみると良いです。
tohmey

2019/11/13 00:25

直接答えになる質問回答は見つからなかったのですが、 そこからヒントを得て、 https://qiita.com/riekure/items/babc7432a80ea90420a8 にあったIOUtils.toByteArray(inputStream)が使えそうなので、試してみます。 ありがとうございます。
dodox86

2019/11/13 00:34

質問のコメント欄を読んでのコメントですが、常に単なるファイルとしてダウンロードしたいのであれば、HTTPレスポンスのフィールドに以下のようにセットすれば実現できると思います。<CR><LF>は"\r\n" です。 Content-Type: application/octet-stream<CR><LF> Content-Disposition: attachment; filename="file.dat"<CR><LF> Content-Length: バイトデータ長<CR><LF> <CR><LF> バイトデータ...
tohmey

2019/11/13 01:06

ありがとうございました。 ひとまず、自環境で動作確認ができたコードを追記することにします。 レスポンス関係は、あいかわらず曖昧な理解で使ってしまっています…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問