2012-07-03 5 views
0

Я создаю документ Excel через Servlet. Когда я отправляю ответ клиенту (IE8), открывается диалоговое окно «Открыть/Сохранить», но для принятия мер требуется, чтобы пользователи дважды щелкали по выбору. Этого не происходит в Firefox. Я понятия не имею, почему это происходит. Ниже приведен соответствующий код, который создает соответствующие потоки.IE8 просит открыть/сохранить дважды файл .xls

result содержит Excel XML.

response.setContentType("application/vnd.ms-excel"); 
response.setHeader("Content-Disposition", "attachment;filename=TestFile.xls"); 

InputStream in = new ByteArrayInputStream(result.toString().getBytes("UTF-8")); 
ServletOutputStream out = response.getOutputStream(); 

try 
{ 
    byte[] outputByte = new byte[4096]; 

    while(in.read(outputByte, 0, 4096) != -1) 
     out.write(outputByte, 0, 4096); 
} 
finally 
{ 
    in.close(); 
    out.flush(); 
    out.close(); 
} 

EDIT Я заметил, что ждет 5+ секунд перед нажатием кнопки вариант работает просто отлично. Кажется, что он только дважды спрашивает, когда сразу щелкает опцию.

+0

Кажется, ошибка в IE: http://support.microsoft.com/ default.aspx? scid = http: //support.microsoft.com: 80/support/kb/articles/q238/5/88.asp & NoWebContent = 1, http://forums.asp.net/t/273944.aspx/ 1 – dragon66

+0

Я нашел те же ссылки, но они довольно старые. Я надеялся, что, возможно, это было исправлено за последние 5 лет. –

ответ

1

Этот код работает хорошо для каждого типа файла, в моем приложении

InputStream in = blob.getBinaryStream(); 
    // Output the blob to the HttpServletResponse 

    String codedfilename = ""; 
    //this code resolves the issue with the encoding of the downloaded filename 
    String agent = request.getHeader("USER-AGENT"); 
    if (null != agent && -1 != agent.indexOf("MSIE")) 
    { 
    codedfilename = URLEncoder.encode(/*here goes the filename*/, "UTF8"); 
    response.setContentType("application/x-download"); 
    response.setHeader("Content-Disposition","attachment;filename=" + codedfilename); 
    } 
    else if (null != agent && -1 != agent.indexOf("Mozilla")) 
    { 
    response.setCharacterEncoding("UTF-8"); 
    //It does not seem to make a difference whether Q or B is chosen 
    codedfilename = MimeUtility.encodeText(rset.getString("FILE_NAME"), "UTF8", "B"); 
    response.setContentType("application/force-download"); 
    response.addHeader("Content-Disposition", "attachment; filename=\"" + codedfilename + "\""); 
    } 

    BufferedOutputStream out = 
     new BufferedOutputStream(response.getOutputStream()); 
    byte by[] = new byte[32768]; 
    int index = in.read(by, 0, 32768); 
    while (index != -1) { 
     out.write(by, 0, index); 
     index = in.read(by, 0, 32768); 
    } 
    out.flush(); 

попробовать и дайте нам знать

+0

Не имеет значения. Хотя я должен упомянуть, что я заметил, что ожидание 5+ секунд, прежде чем щелчок по опции работает просто отлично. Кажется, что он только дважды спрашивает, когда сразу щелкает опцию. –

+0

с использованием пользовательского агента может быть сложным, они притворяются друг с другом - http://webaim.org/blog/user-agent-string-history/. Некоторые старые Opera использовали MSIE внутри своего агента. – JIV

+0

Получил меня в правильном направлении, но все еще не решил проблему. –

Смежные вопросы