1

リンクをクリックすると、サーバーの一時フォルダーにあるPDFファイルをダウンロードする必要があるスクリプトがあり、これはAJAX関数を呼び出して実行しています。そのAJAX関数は、ファイルのコンテンツを読み取って出力ストリームに書き込むstruts 2アクションメソッドを呼び出しています。

問題は、そのファイルが一時フォルダーに存在しない場合です。それは例外をスローしています。そこで、json を使って処理することにしました。そのファイルが一時フォルダーに存在する場合。キーをマッピングしています

jsonObject.put("exist", true)

そのファイルが一時フォルダーに存在しない場合。キーをマッピングしています

jsonObject.put("exist", false)

そしてstruts.xmlでは、この方法でアクションを処理しています

<action name="DisplayStaticPdf"
        class="com.ui.DisplayStaticPdfAction">
<result name="success" type="json"/>
</action>

スクリプトでは、この方法で処理しています

function downloadDoc(actionName){
            $.ajax({
            url: actionName,
            type: 'post',
            dataType: 'json',
            error: function(data) {
                if(data.exist!= null && data.exist == 'false'){
                    alert('The document you are trying to download does not exist at location.  Please make sure file exist .');
                }
            },
            success: function() {
            }
        });
     }

ファイルが存在しない場合、同じアラートが表示されます。ただし、ファイルが存在しない場合は何もせず、temp フォルダーにある pdf をダウンロードしません。

私のアクションクラスは次のようになります->

String pdfFileName = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
String rawFileName = "abc.pdf";
String returnString = "fileNotExist";
jsonObject = new JSONObject();

ServletOutputStream out = response.getOutputStream();
response.setContentType("application/pdf");
URL url = new URL(fileURL);

URLConnection conn = url.openConnection();
if (conn.getContentLength() != 0 && conn.getContentLength() != -1)
{
  bis = new BufferedInputStream(conn.getInputStream());
  bos = new BufferedOutputStream(out);

  try
  {
    byte[] buff = new byte[2048];
    int bytesRead;
    while (-1 != (bytesRead = bis.read(buff, 0, buff.length)))
    {
      bos.write(buff, 0, bytesRead);
    }
    jsonObject.put("exist", true);
  }
  returnString = SUCCESS;
}
else
{
  jsonObject.put("exist", false);
  returnString ="fileNotExist";
}
return returnString;

皆さんが私の問題を理解してくれることを願っています。私が正しいアプローチでそれを行っているかどうかにかかわらず、誰でもこれに光を当ててください。またはそれを行う他の簡単な方法はありますか

ありがとう、
アンキット

4

0 に答える 0