Скачать изображение в искре java

Я следил за обсуждением на странице spark github, а также за переполнением стека, чтобы понять, как загружать файлы, используя загрузку файлов spark и apache.

Теперь я хочу, чтобы у пользователя была возможность загрузить изображение по клику.

Например, мои загруженные файлы сохраняются в /tmp/imageName.jpg на сервере.

На стороне клиента я хочу дать пользователю возможность загрузить файл, когда пользователь щелкает гиперссылку.

<a href="/image/path">click here</a> 

Когда пользователь нажмет на гиперссылку, я вызову функцию с путем к файлу, но не могу понять, как отправить изображение в ответ.

Я знаю, что HTML5 имеет атрибут загрузки, но для этого файлы должны храниться в общая папка на сервере, что невозможно.

Я рассмотрел предыдущий аналогичный вопрос, который безуспешно пытался воспроизвести для моего сценария.

Как я могу отправить PNG QR-кода в теле ответа HTTP (с помощью Spark)?

Как скачать файл с помощью java spark?

Изменить: я перешел по ссылке, указанной в ответе, чтобы принудительно загрузить изображение, но с помощью response.raw() я не могу получить ответ

response.type("application/force-download");
        response.header("Content-Transfer-Encoding", "binary");
        response.header("Content-Disposition","attachment; filename=\"" + "xxx\"");//fileName);
        try {
        HttpServletResponse raw = response.raw();
        PrintWriter out = raw.getWriter();
        File f= new File("/tmp/Tulips.jpg");

        InputStream in = new FileInputStream(f);
        BufferedInputStream bin = new BufferedInputStream(in);
        DataInputStream din = new DataInputStream(bin);

        while(din.available() > 0){
            out.print(din.read());
            out.print("\n");
        }

        }
        catch (Exception e1) {
            e1.printStackTrace();
        }
        response.status(200);
        return response.raw();

Редактировать 2:

Я не уверен, в чем разница между использованием response.body() и response.raw().someFunction(). В любом случае я могу отправить данные обратно в ответ. Даже если я напишу простой response.body("hello"), это не отразится на моем ответе.

Есть ли разница в том, как будет читаться файл, а не изображение? Пример использования класса ImageIO?


person je2tdam    schedule 12.02.2016    source источник
comment
Возможный дубликат Как заставить браузер загрузить файл?   -  person Paulo Pedroso    schedule 13.02.2016
comment
ответ.raw(); // необработанный ответ, переданный Jetty   -  person dom farr    schedule 03.03.2016
comment
ответ.тело(Привет); // устанавливает содержимое в Hello   -  person dom farr    schedule 03.03.2016


Ответы (1)


Ниже приведено решение, которое работает для меня:

Service.java

get(API_CONTEXT + "/result/download", (request, response) -> {

        String key = request.queryParams("filepath");
        Path path = Paths.get("/tmp/"+key);
        byte[] data = null;
        try {
            data = Files.readAllBytes(path);
        } catch (Exception e1) {

            e1.printStackTrace();
        }

        HttpServletResponse raw = response.raw();
        response.header("Content-Disposition", "attachment; filename=image.jpg");
        response.type("application/force-download");
        try {
            raw.getOutputStream().write(data);
            raw.getOutputStream().flush();
            raw.getOutputStream().close();
        } catch (Exception e) {

            e.printStackTrace();
        }
        return raw;


   });

Угловой код

$scope.downloadImage= function(filepath) {
         console.log(filepath);
         window.open('/api/v1/result/download?filepath='+filepath,'_self','');
     }
person je2tdam    schedule 03.03.2016