2013-11-01 3 views
0

У меня есть файл PDF на моем сервере, который мне нужен для загрузки с клиентской стороны.Открыть/Сохранить как ... диалоговое окно, не показывающее

Использование Spring Framework, я использую javax.servlet.http.HttpServletResponse создать правильный ответ и соответствующий заголовок:

response.setHeader("Expires", "-1"); 
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
response.setHeader("Pragma", "public"); 
response.setContentType("application/pdf"); 
response.setHeader("Content-Disposition", "attachment;filename="content.pdf"); 
response.setContentLength(content.size()); 

Затем я использую ServletOutputStream написать содержание:

ServletOutputStream os; 
try { 
    os = response.getOutputStream(); 
    os.write(((ByteArrayOutputStream)baos).toByteArray()); 
    baos.close(); 
    os.flush(); 
    os.close(); 
} catch (IOException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 

На стороне клиента я получаю HTTP-код 200 и получаю правильное тело ответа с файлом PDF, но всплывающее окно «Сохранить как ...» не отображается.

Есть ли какая-либо причина в конфигурации заголовка, которая может привести к этой проблеме или может быть где-то еще?

спасибо.

+0

какой браузер вы используете? –

+0

@MicheleMariotti IE 9 – xptoo

+0

Вы вызываете этот код из сервлета или с страницы jsp? вы уверены, что никакой другой заголовок не установлен? –

ответ

0

может быть:

attachment;пространствоfilename=content.pdf

обновление

public static void download(HttpServletResponse response, File file, String downloadName) throws IOException 
{ 
    if(file == null) throw new IllegalArgumentException("file is null"); 

    response.reset(); 
    response.setHeader("Content-Length", String.valueOf(file.length())); 
    response.setContentType(new MimetypesFileTypeMap().getContentType(file)); 
    response.setHeader("Content-Disposition", "attachment; filename=\"" + downloadName + "\""); 

    InputStream input = new FileInputStream(file); 

    try 
    { 
     OutputStream output = response.getOutputStream(); 

     try 
     { 
      IOUtils.copy(input, output); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 

      throw e; 
     } 
     finally 
     { 
      output.close(); 
     } 
    } 
    catch(IOException e) 
    { 
     throw e; 
    } 
    finally 
    { 
     input.close(); 
    } 
} 

и единственное различие я вижу в разделе заголовков. Вы пробовали без контроля кеша, прагмы и истекали?

обновление

нет разницы на всех, используя файл или поток:

public static void download(HttpServletResponse response, InputStream input, String downloadName, String contenType) throws IOException 
{ 
    response.reset(); 
    response.setHeader("Content-Length", String.valueOf(input.available())); 
    response.setContentType(contenType); 
    response.setHeader("Content-Disposition", "attachment; filename=\"" + downloadName + "\""); 

    OutputStream output = response.getOutputStream(); 
    IOUtils.copy(input, output); 
    input.close(); 
} 
+0

нет, это не сработало – xptoo

+0

Извините, мое плохое.Файл, который я хочу экспортировать, создается с ответом HTTP и не сохраняется на сервере. – xptoo

+0

Я пробовал решение для копирования IOUtils и не работал. Кроме того, если мы используем сетевой монитор, мы можем получить файл PDF из ответа HTTP. Возможно ли, что я не закрываю поток правильно? – xptoo

0

Попробуйте установить тип содержимого application/octet-stream вместо:

response.setContentType("application/octet-stream"); 

Это должно заставить браузер чтобы отобразить всплывающее окно «Сохранить как ...». Если вы установите его на application/pdf, браузер распознает тип файла и отображает его.

0

Когда я запустил этот код проблема пришла в

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

для определения имени файла

Try:

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

Это откроет диалоговое окно и даст вам сохранить как вариант, когда нажав кнопку сохранения

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