2013-09-17 6 views
2

Я внедрил servlet для загрузки файлов документов, доступных в моем классе классов приложений.Проблема с загрузкой MSWord с использованием HttpServlet

что происходит; файл загружается, но ms-word не может открыть его. увидеть скриншот ms-word:

msword screenshot

Servlet реализация выглядит следующим образом:

public class DownloadFileServlet extends HttpServlet { 

    protected void doGet(
     HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

     String fileName = "test.doc"; 
     ClassPathResource resource = new ClassPathResource(File.separator + fileName); 
     ServletOutputStream sos = null; 
     FileInputStream fis = null; 

     try { 
      response.setContentType("application/msword"); 
      response.setHeader("Content-disposition", "attachment; fileName=\"" + fileName + "\""); 

      fis = new FileInputStream(new File(resource.getURI().getPath())); 
      byte[] bytes = org.apache.commons.io.IOUtils.toByteArray(fis); 

      sos = response.getOutputStream(); 
      sos.write(bytes); 
      sos.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
     if(fis != null) { 
      fis.close(); 
     } 
     if(sos != null) { 
      sos.close(); 
     } 
     } 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doGet(request, response); 
    } 
} 

я пробовал почти все предложенные типы контента для ms-word файлов. но все же он не работает.

application/msword 
application/ms-word 
application/vnd.ms-word 

Просьба предложить мне сделать ошибку или есть какой-либо другой способ достижения.

Примечание: я попробовал почти все подходы, доступные на SO.

+0

Как вы сделать его работу –

ответ

0

Я не знаю, что делает класс ClassPathResource. поэтому немного изменил код.

ClassLoader clsLoader = Thread.currentThread(). GetContextClassLoader();

InputStream is = clsLoader.getResourceAsStream ("test.doc");

и в использовании попытка блока:

байт [] байт = org.apache.commons.io.IOUtils.toByteArray (есть);

это должно работать нормально. Я разместил документ в пути к классам. изменить его в соответствии с вашими потребностями.

Что касается отображения mime, откройте свойства своего сервера, и вы найдете список картинок mime. Например. в eclipse для tomcat, просто дважды щелкните по серверу, и вы сможете найти там список сопоставления mime. application/msword работал отлично

+0

Просьба Reffer по следующей ссылке относительно ClasspathResource?: http://docs.spring.io/spring/docs/2.0.x/api/org/springframework/core/io/ClassPathResource.html –

+0

Я не понимаю, что не так в коде. Просто добавили ядро ​​весеннего ядра и ваш код работает отлично для меня, единственное изменение, которое я сделал, это изменить temlateFileName на "test.docx", так как я не вижу его объявления. Вы видите какие-либо ошибки в conosle? –

+0

Я изменил вопрос и исправил ошибка имени переменной для temlateFileName –

1

Вместо чтения, преобразования в байт [] просто напишите непосредственно на OutputStream. Вы не должны закрывать OutputStream, поскольку он обрабатывается контейнером для вас.

Я хотел бы переписать метод сервлета более или менее следующее (также почему это сервлет и не (@)Controller

protected void doGet(
     HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

     String fileName = "test.doc"; 
     ClassPathResource resource = new ClassPathResource(File.separator + fileName); 

     InputStream input = resource.getInputStream(); 
     try { 
      response.setContentType("application/msword"); 
      response.setHeader("Content-disposition", "attachment; fileName=\"" + fileName + "\""); 
      org.springframework.util.StreamUtils.copy(input, response.getOutputStream()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (input != null) { 
       try { 
        input.close(); 
       } catch (IOEXception ie) {} 
      } 
     } 
    } 
+0

ваши предложения выглядят хорошо ... делая код более красивым –

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