0

サーバー上のファイルに URL をリダイレクトして、その URL が開かれると、サーバーから特定の pdf ファイルを取得してブラウザーで開くようにしたいと考えています。クライアントサーバーインターフェースで動作します。URL をサーバー上の特定のファイルにリダイレクトする方法を教えてください。

4

2 に答える 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 に答える