Pessoal,

novamente aqui estou eu com uma dúvida.

Consegui usar SpringMVC com Annotations, sem problemas, usando da seguinte 
forma:

Minha classe DownloadController que recebe as requisições HTTP e chamada o meu 
service que exibe o documento PDF na tela:

@Controller
public class DownloadController{
   
   private static final long serialVersionUID = 1L;
   
   @Autowired
   private DownloadManager downloadManager;
   
   @RequestMapping("/get")
   public void streamImageContent(@RequestParam("docId") int docId, 
OutputStream outputStream) throws DataAccessException, Exception {
      this.downloadManager.exibeDocumento(docId, outputStream);
   }
}

Ou seja, quando eu chamo http://localhost:8080/meusite/download/get?docId=1 ele 
executa o método streamImageContent, que por sua vez passa o docId para o 
downloadManager.exibeDocumento(int docId, outputStream) fazer a impressão do 
documento PDF na tela, conforme exemplificado abaixo:

@Repository(value="downloadManager")
public class DefaultDownloadManager extends HibernateDaoSupport implements 
DownloadManager {

   @Autowired
   public DefaultDownloadManager(@Qualifier("sessionFactory")SessionFactory 
factory) {
      super.setSessionFactory(factory);
   }
   
   public void exibeDocumento(int docId, OutputStream os)
         throws Exception {
      
      Documento documento = 
(Documento)getHibernateTemplate().load(Documento.class, docId);

      if (documento != null) {
         
         String caminho = documento.getPasta().getCaminho() + "\\" + 
documento.getPasta().getNome() + "\\" + documento.getNomeArquivo();
         boolean fileexist = false;
         File filename = null;
         
         filename = new File(caminho);
         fileexist = (filename.exists() && filename.canRead());
         
         if (fileexist)
         {
            BufferedInputStream in = new BufferedInputStream(new 
FileInputStream(filename));
            try {
               FileCopyUtils.copy(in, os);
            } catch (Exception e) {
               throw new Exception("Erro ao copiar arquivo para outputStream. " 
+ e.getMessage());
            }
         }
      }
   }
}


Pelo que eu entendo, o mecanismo que joga o PDF na tela do usuário é através da 
chamada da seguinte linha:

FileCopyUtils.copy(in, os);

Quando essa função é executada, o PDF é aberto fora da janela do browser. Aí é 
onde está o meu problema. Eu preciso que o PDF seja exibido dentro da janela do 
internet explorer. Esse é um requisito do meu sistema. Já tentei de diversas 
maneiras, mas não consegui até agora.

Eu vasculhei os projetos samples que vem com o Spring, e vi que os Controllers 
deles usam o método public ModelAndView handleRequest(HttpServletRequest 
request, HttpServletResponse response), que me fornece um objeto response para 
que eu possa configurar o cabeçalho HTTP para que ele seja exibido inline, 
assim: response.setHeader("Content-Disposition","inline; 
filename=\"nomeDoPdf.pdf\"");.

Como a minha classe Controller é via annotations e eu uso o 
@RequestMapping("/get"). Mesmo colocando o método handleRequest, este não é 
chamado, apenas os métodos mapeados com a Annotation.

No meu arquivo web.xml eu tenho a declaração do servlet:

<servlet>
     <servlet-name>download</servlet-name>
     
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>download</servlet-name>
    <url-pattern>/download/*</url-pattern>
</servlet-mapping>


E tenho um arquivo chamado download-servlet.xml, com o conteúdo abaixo:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans";
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:context="http://www.springframework.org/schema/context";
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd";>

   <!-- Activates @Autowired for DownloadController
   <context:annotation-config/>-->

   <!-- MultiActionController that defines user interface actions as separate 
methods -->
   <!-- <bean id="downloadController" 
class="com.joaopaulobraga.controller.web.DownloadController"/> -->

   <bean id="downloadController" 
class="com.joaopaulobraga.controller.web.DownloadController">
      <property name="downloadManager" ref="downloadManager"/>
   </bean>

    <!-- MultipartResolver for parsing file uploads, implementation for Commons 
FileUpload -->
   <bean id="multipartResolver" 
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <property name="maxUploadSize" value="10240000" />
   </bean>
   
</beans>


Isso indica que o DownloadController será responsável pela manipulação do 
servlet download.

O meu problema está em não ter o objeto response junto do método 
FileCopyUtils.copy(in, os);, para que eu possa indicar o header 
Content-disposition:inline.

Um detalhe: Quando o arquivo é uma imagem JPEG, por exemplo, ela é aberta 
dentro do browser.


Agradeço antecipadamente qualquer dica de como resolver esse problema.

João Paulo



--~--~---------~--~----~------------~-------~--~----~
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para [email protected]
Para sair da lista, envie um email em branco para [EMAIL PROTECTED]
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---

Responder a