サーバー上のファイルに URL をリダイレクトして、その URL が開かれると、サーバーから特定の pdf ファイルを取得してブラウザーで開くようにしたいと考えています。クライアントサーバーインターフェースで動作します。URL をサーバー上の特定のファイルにリダイレクトする方法を教えてください。
質問する
347 次
2 に答える
0
あなたの質問を正しく理解できたら、次の URL があると仮定します。
http://somesiste.bla/render?path=/dirx/hello1.pdf
PDF ファイルがアプリケーションの WAR ファイルにある場合、WAR ファイルは次のようになります。
WAR
-- index.jspx
-- WEB-INF
--web.xml
-- data
--dirx
--hello01.pdf
--hello02.pdf
次に、アプリで適切なファイルに転送するだけで、これは非常に簡単です
public void forwardToPdf( HttpServletRequest request, HttpServletResponse response, String path ) throws ServletException, IOException
{
RequestDispatcher requestDispatcher= request.getRequestDispatcher("/data/" +path) ;
requestDispatcher.forward( request, response ) ;
}
// Get the parameter and pass it on
String path = getParameter("path");
forwardToPdf(request, response, path);
しかし、ファイルがアプリケーションの外にある場合は、
C:\data\
そのファイルにリダイレクトするだけではなく、そのファイルを読み込んでユーザーにレンダリングする必要があります
それを行うための小さなユーティリティです。
import java.io.Closeable;
import java.io.IOException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
public class FileDownloadHelper {
public static final String CONTENT_TYPE_EXCEL ="application/vnd.ms-excel";
public static final String CONTENT_TYPE_WORD_DOCUMENT ="application/doc";
public static final String CONTENT_TYPE_MS_WORD ="application/msword";
public static final String CONTENT_TYPE_PDF ="application/pdf";
public static final String CONTENT_DISPOSITION_INLINE ="inline";
public static final String CONTENT_DISPOSITION_ATTACHMENT ="attachment";
public void write(HttpServletResponse response, byte[] data, String contentType, String outputFileName, String contentDisposition){
response.setCharacterEncoding("UTF-8");
ServletOutputStream sos = null;
try {
sos = response.getOutputStream();
response.setStatus(HttpServletResponse.SC_OK);
if(data != null){
response.setContentType(contentType);
long contentLength = data.length;
/* IE requires the following for pdf files */
response.setBufferSize((int)contentLength);
//This enables us to show estimated download time
response.setHeader("Content-Length", String.valueOf(contentLength));
// inline=forces to use a viewer attachment=show save dialog
//response.setHeader("Content-Disposition", "inline; filename=\"" + outputFileName + "\"");
response.setHeader("Content-Disposition", contentDisposition+"; filename=\"" + outputFileName + "\"");
// These set of headers need to be here for this to work with IE with servlet security
// This will prevent catching of the results
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
sos.write(data);
}else{
sendResponse404(response);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
close(sos);
}
}
/**
* Helper method to send 404 - Resource not found message
* @param response
*/
private void sendResponse404(HttpServletResponse response) {
//Resource not found
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
response.setContentType("text/html");
try {
response.getOutputStream().write("Resource not found".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Helper method to take care of cleanup
* @param resource to close
*/
private void close(Closeable resource) {
if (resource != null) {
try {
resource.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
そして、次のように簡単に使用できます
// Force browser to download the resource
FileDownloadHelper download = new FileDownloadHelper();
download.write(response, readFileToBytes(pathToFileOnYourFileSystem), FileDownloadHelper.CONTENT_TYPE_PDF,"OUTPUTFILENA.PDF",
FileDownloadHelper.CONTENT_DISPOSITION_ATTACHMENT
これが役に立ち、理にかなっていることを願っています。「readFileToBytes」やパラメーターの取得など、いくつか不足していますが、これでうまくいくはずです。
于 2012-11-29T13:04:46.340 に答える
0
new File(path).toURI().toURL();
于 2012-11-29T11:06:16.187 に答える