Приложение Content-Disposition не работает - выводит биты на экран - PullRequest
3 голосов
/ 30 мая 2011

Я пытаюсь загрузить файл PDF в классе Struts Action.Проблема в том, что при использовании

response.setHeader("Content-Disposition", "attachment;filename=file.pdf");

я хочу открыть окно для «сохранить / открыть», но теперь содержимое PDF записывается в браузере: например,

%PDF-1.4 28 0 obj << /Type /XObject /Subtype /Image /Filter /DCTDecode /Length 7746 /Width 200 /Height 123 /BitsPerComponent 8 /ColorSpace /DeviceRGB >>...(cut)

Я пытался этот код(ниже) под Chrome, Firefox и IE и везде это то же самое.Также я использовал разные PDF-файлы для этого.

Мой фрагмент кода:

try {
    URL fileUrl = new URL("file:///" + filePath);
    URLConnection connection = fileUrl.openConnection();
    inputStream = connection.getInputStream();
    int fileLength = connection.getContentLength();
    byte[] outputStreamBytes = new byte[100000];
    response.setContentType("application/pdf");
    response.setHeader("Content-Disposition", "attachment;filename=file.pdf");
    response.setContentLength(fileLength);
    outputStream = response.getOutputStream();
    int iR;
    while ((iR = inputStream.read(outputStreamBytes)) > 0) {
        outputStream.write(outputStreamBytes, 0, iR);
    }

    return null;
} catch (MalformedURLException e) {
    logger.debug("service", "An error occured while creating URL object for url: "
        + filePath);
    response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return null;
} catch (IOException e) {
    logger.debug("service", "An error occured while opening connection for url: "
        + filePath);
    response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return null;
} finally {
    if (outputStream != null) {
        outputStream.close();
    }
    if (inputStream != null) {
        inputStream.close();
    }
    inputStream.close();
}
return null;

Чего-то еще не хватает?

РЕДАКТИРОВАТЬ

Когда я использую этот код вКласс Struts не работает, но когда я использую этот код в сервлете, он работает.Самое странное, что когда я в классе действия пишу только «response.sendRedirect ()» в Servlet (а вся логика в Servlet), он тоже не работает.

Когда я анализировал заголовки ответа, все в этихтри примера одинаковы.

1 Ответ

5 голосов
/ 30 мая 2011

Попробуйте изменить заголовок Content-Type на что-то, что не распознается браузером.Вместо

response.setContentType("application/pdf");

используйте

response.setContentType("application/x-download");

. Это позволит браузеру не воздействовать на содержимое тела (включая обработку содержимого плагинами) и принудительно вызываетбраузер для отображения диалогового окна «Сохранить файл».

Кроме того, также может быть полезно проверить, необходимо ли наличие одного пробела после точки с запятой в заголовке Content-Disposition для запуска требуемого поведения,Поэтому вместо следующей строки

response.setHeader("Content-Disposition", "attachment;filename=file.pdf");

используйте вместо нее следующее:

response.setHeader("Content-Disposition", "attachment; filename=file.pdf");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...