1

私はjsfアプリを持っていて、ユーザーがボタンをクリックすると、このサーブレットを呼び出すバッキングBeanメソッドがあります。

問題は、IE7とIE8ではファイルをダウンロードできないことです。エラーメッセージが表示されます。

Internet Explorer cannot download ExcelGenerator from mydomain.com

これをIE7/IE8で機能させるには、何をする必要がありますか?追加のヘッダーを設定する必要がありますか?

サーブレットを呼び出すバッキングBeanメソッド:

public void generateExcel()
{
    FacesContext context = FacesContext.getCurrentInstance();
    String url = context.getExternalContext().getRequestContextPath() + "/ExcelGenerator";
    context.getExternalContext().redirect(url);
}

Excelファイルを生成するサーブレット:

 public class ExcelGenerator extends HttpServlet {

        private static final long serialVersionUID = 1L;
        private static final Logger LOG = LoggerFactory.getLogger(ExcelGenerator.class);

        @Override
        public void init(ServletConfig config) throws ServletException {
            super.init(config);
        }

        @SuppressWarnings("unchecked")
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            SXSSFWorkbook wb = new SXSSFWorkbook();
            Sheet sheet = wb.createSheet("Results");
            List<List<TableData>> results = (List<List<TableData>>) request.getSession().getAttribute("results");
            String tableName = (String) request.getSession().getAttribute("tableName");
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            Date date = new Date();
            String filename = tableName+"-"+df.format(date)+".xlsx";
            OutputStream out = null;

            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Expires:", "0"); // eliminates browser caching
            response.setHeader("Content-Disposition", "attachment; filename="+filename);

            int rowCounter = 0;

            // Create the rows
            for(List<TableData> l : results) {

                int counter = 0;
                Row row = sheet.createRow(rowCounter);

                for(TableData td : l) {

                    Cell cell = row.createCell(counter);

                    // if we're on the first row, get the column description, else get the data
                    if(rowCounter == 0) {
                        cell.setCellValue(td.getColumnDescription());
                    } else {
                        cell.setCellValue(td.getData());
                    }
                    counter++;
                }
                rowCounter++;
            }

            try {
                out = response.getOutputStream();
                wb.write(out);
                out.flush();
            } catch (Exception e) {
                LOG.debug(e.getStackTrace().toString());
            } finally {
                out.close();
                wb.dispose();
            }
        }
    }
4

3 に答える 3

3

InternetExplorerはmydomainからExcelGeneratorをダウンロードできません。

このエラーは、ドメインがHTTPS上にあり、応答でキャッシュが許可されていない場合によく発生します。MSKB316431も参照してください。

修正はかなり簡単です:

if (request.isSecure()) {
    response.setHeader("Cache-Control", "public");
    response.setHeader("Pragma", "public");
}

参照:

于 2013-02-05T16:05:35.603 に答える
0

最近のブラウザバージョンとヘッダーの互換性を一覧表示するこのページをご覧ください。Content-DispositionIEにエラーを表示させる可能性のある、特にファイル名部分のエンコード方法に関する値の特定の組み合わせがあります。

于 2013-02-05T16:02:37.703 に答える
0

私はこの問題に直面しました、そして次のエントリはこの問題を解決します

response.setContentType( "application / vnd.ms-xls; charset = utf-8");

response.setHeader( "Content-disposition"、 "attachment; filename =" + filename);

response.setHeader( "Pragma"、 "public");

response.setHeader( "Cache-Control"、 "public、max-age = 3800");

于 2015-05-01T14:39:51.530 に答える