0

ユーザーがサーバーから画像ファイルをダウンロードできるWebアプリケーションがあります。ユーザーがjspページのボタンを押すと、サーブレットを実行し、それに応じて画像ファイルを送信するajax postリクエストが行われます。しかし問題は、イメージ ファイルがダウンロードされず、[名前を付けて保存] ダイアログ ボックスが表示されないことです。

Firebug では、リクエストが正しく送信され、正しい Contect Type とステータス コード 200 で応答が受信されたことがわかります。firebug の [Response] タブにもバイナリ データが表示されますが、何らかの理由で画像がダウンロードされません。助けてください。

リクエスト: *リクエスト URL:http://localhost:8080/SVGToImage/convertToImg

リクエスト方法:POST

ステータスコード:200 OK*

応答:

*Content-Disposition:filename="out.jpg"

コンテンツタイプ:image/jpeg

日付:2013 年 5 月 31 日 (金) 17:28:26 GMT

サーバー:Apache-Coyote/1.1

Transfer-Encoding:chunked*

ここに私のJSPがあります

<head>

<script>

    function exportToImage(){

    var svg = document.getElementById("ext-gen1040");       

    var svg1 = new XMLSerializer().serializeToString(svg);

        jQuery.noConflict();

        jQuery.ajax({
            url: "convertToImg" ,
            type: "POST",
                    data: { q = svg1},
            success: function(data) {               
            },
          error: function(jqXHR, textStatus, errorThrown) {
              alert('Error ' + textStatus);
          }     
});

</script>

</head>

<body>
<input type="button" value="export" onclick="javascript:exportToImage();">
</body>

サーバー側では、サーブレット コードは次のとおりです。

private void doPost(HttpServletRequest request,
        HttpServletResponse response)  throws ServletException, IOException {
    // TODO Auto-generated method stub

    String filePath = "C:/Users/nandan.jain/Pictures/out.jpg";
    File file = new File(filePath);
    int length   = 0;
    ServletOutputStream outStream = response.getOutputStream();

    response.setContentType("image/jpeg");
    response.setContentLength((int)file.length());
    String fileName = (new File(filePath)).getName();

    // sets HTTP header
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

    byte[] byteBuffer = new byte[BUFSIZE];
    DataInputStream in = new DataInputStream(new FileInputStream(file));

    // reads the file's bytes and writes them to the response stream
    while ((in != null) && ((length = in.read(byteBuffer)) != -1))
    {
        outStream.write(byteBuffer,0,length);
    }

    in.close();
    outStream.close();


}

ありがとう

4

1 に答える 1

3

ajax でファイルをダウンロードすることはできません。Ajax は JavaScript 言語によって実行されます。JavaScript 言語には、明らかにセキュリティ上の理由から、[名前を付けて保存] ダイアログをプログラムでトリガーし、任意のファイル コンテンツを提供する機能がありません。

ajax 以外のリクエストでダウンロードするだけです。Content-Dispositionheader が に設定されている場合attachment、現在のページは変更されません。

だから、そのすべての代わりにjQuery.ajax()、あなたはただすることができます

window.location = "convertToImg?q=" + encodeURIComponent(svg1);

代わりにサーブレットでジョブを実行しますdoGet()

または、本当に POST が必要な場合は、通常の送信フォームにします。

<form action="convertToImg" method="post">
    <input type="hidden" name="svg1" />
    <input type="submit" onclick="exportToImage(this)" />
</form>

function exportToImage(button) {
    var svg = document.getElementById("ext-gen1040");       
    var svg1 = new XMLSerializer().serializeToString(svg);
    button.form.svg1.value = svg1;
}

具体的な問題は、JSP/サーブレットとはまったく関係がないことに注意してください。

于 2013-05-31T18:03:34.960 に答える