1

Spring MVC を使用して、ボタンを押すと Web アプリケーションの外部のサーブレットにヒットし、Excel スプレッドシートを返すボタンを持つ Web アプリケーションを作成しています。

アプリケーション間の直接リンクではなく、サーブレット対サーブレット スタイルのリンクを使用しています。ただし、httpヘッダーに少し問題があります。何が起こっているのかというと、他のアプリケーションからファイルを取得してから、アプリケーションでファイルがユーザーに返されるまでの間に、ファイルが破損しています。httpヘッダーをきちんと書いていないからだと思います。自分のアプリ以外で他のアプリを叩いてもファイルは大丈夫なのでこう思っています。

私が達成しようとしているのは、ファイル名を除いて、サーブレットが他のアプリケーションから受け取る http ヘッダーとまったく同じように、アプリケーションの http ヘッダーを作成するコードです。

これが私のコードです。

private void getReportContent(HttpServletRequest request, HttpServletResponse response) throws BusinessException, ParseException {
    HttpSession session = request.getSession(true);
    int statusCode = 0;
    HttpState state = null;

synchronized (session) {
    state = (HttpState) session.getAttribute(HTTP_STATE_KEY);
    if (state == null) {
        if (logger.isDebugEnabled())
            logger.debug("Creating new http state.");
        state = createHttpState(request);
        session.setAttribute(HTTP_STATE_KEY, state);
    }
}
String reportURL = null;
GetMethod getMethod = null;

try {

    // Generate the Report URL
    reportURL = createReportURL(request, response);                 
    getMethod = new GetMethod(reportURL);   
    getMethod.setFollowRedirects(false);

    // Retrieve the Report          
    statusCode = client.executeMethod(client.getHostConfiguration(), getMethod, state);
    if (logger.isDebugEnabled())
        logger.debug("Status code from Reports servlet: " + statusCode);
    if (statusCode != HttpStatus.SC_OK) {
        throw new BusinessException(new Exception("No Report content found. Received HTTP status code " + getMethod.getStatusCode()));
    }

    response.setHeader("Date", getMethod.getResponseHeader("Date").getValue());
    response.setHeader("Server", getMethod.getResponseHeader("Server").getValue());
    response.setHeader("Content-Length", getMethod.getResponseHeader("Content-Length").getValue());
    response.setHeader("Content-Length", getMethod.getResponseHeader("Content-Length").getValue());
    response.setHeader("Content-Type", getMethod.getResponseHeader("Content-Type").getValue()); 
    response.setHeader("Content-disposition", "attachment; filename=\"" + REP_REPORT_NAME + "\"");
    //Set the response into HttpServletResponse
    ServletOutputStream outputStream = response.getOutputStream();
    outputStream.write(getMethod.getResponseBody());            

} catch (IOException e){
    logger.error("Unable to contact report URL", e);
    throw new BusinessException("Unable to contact report URL",e);
} finally {
    // Close the HTTPClient connection
    if (getMethod!= null){
        getMethod.releaseConnection();
    }
}

}

誰かが私が間違っていることを知っていますか、または私がやりたいことを達成するためのヒントを誰かが提案できますか? デバッグセッションで、他のアプリケーションから返されたヘッダーを見ると...

[Date: Mon, 26 Aug 2013 10:47:42 GMT 
, Server: Oracle-Application-Server-10g/9.0.4.1.0 Oracle-HTTP-Server 
, Content-Length: 802570 
, Content-Disposition: attachement; name="TestEmployeeReport.xls"
, Content-Type: application/vnd.ms-excel
]
4

0 に答える 0