4

spark githubページとスタック オーバーフローに関するディスカッションに従って、spark と apache ファイルのアップロードを使用してファイルをアップロードする方法を理解しました。

ここで、クリック時に画像をダウンロードするオプションをユーザーに提供したいと考えています。

たとえば、アップロードしたファイルはサーバーの /tmp/imageName.jpg に保存されます。

クライアント側では、ユーザーがハイパーリンクをクリックしたときにファイルをダウンロードするオプションをユーザーに提供したいと考えています。

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

ユーザーがハイパーリンクをクリックすると、ファイル パスを使用して関数が呼び出されますが、応答として画像を送信する方法がわかりません。

HTML5にはダウンロード属性があることは知っていますが、ファイルをサーバー上のパブリックフォルダーに保存する必要がありますが、これは不可能です。

私は成功せずに私のシナリオのために複製しようとした前の同様の質問を追加しました

QR コードの PNG を 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クラスを使用した例?

4

1 に答える 1

4

以下は私のために働く解決策です:

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;


   });

Angular コード

$scope.downloadImage= function(filepath) {
         console.log(filepath);
         window.open('/api/v1/result/download?filepath='+filepath,'_self','');
     }
于 2016-03-03T18:05:54.927 に答える