SparkとJava8のファイルダウンロードサンプル


Spark-Java のファイルダウンロードサンプル。
Servletでの処理そのまま。

起動してhttp://localhost:4567/file にアクセスするとプロジェクトのroot/public/資料.xlsxがダウンロードされる。

DownloadFileSample
package spqrk;

import static spark.Spark.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import spark.utils.IOUtils;

public class HelloWorld {

    public static void main(String[] args) {

        before("/hello", (req, res) -> {
            System.out.println("/helloの前処理");
        });

        get("/hello", (req, res) -> {
            System.out.println("/hello");
            return "Hello Spark World";
        });

        get("/file", (req, res) -> {
            System.out.println("ファイルをダウンロード");

            // ダウンロードファイルの作成
            String fileName = "資料.xlsx";

            // プロジェクトのroot/public/ フォルダが使用される。
            File file = new File("public/" + fileName);
            String savePath = file.getAbsolutePath();

            System.out.println("ダウンロードするファイル=" + savePath);

            byte[] fileContent = null;
            try (InputStream is = new FileInputStream(savePath);) {
                fileContent = IOUtils.toByteArray(is);
            } catch (FileNotFoundException e) {
                throw new RuntimeException(fileName + " not found");
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            // ファイル名の文字化け対策。
            String downName = URLEncoder.encode(fileName, "UTF-8");

            res.raw().setContentType("application/octet-stream");
            res.raw().setHeader("Content-Disposition", "attachment; filename=" + downName);
            res.raw().setContentLength(fileContent.length);

            try (OutputStream os = res.raw().getOutputStream();) {
                os.write(fileContent);
                os.flush();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            return "";
        });

    }
}