リンクをクリックすると、サーバーの一時フォルダーにある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;
皆さんが私の問題を理解してくれることを願っています。私が正しいアプローチでそれを行っているかどうかにかかわらず、誰でもこれに光を当ててください。またはそれを行う他の簡単な方法はありますか
ありがとう、
アンキット