2013-05-16 4 views
1

내 앱의 "파일 내보내기"옵션을 클릭하면 "다른 이름으로 저장"창이 표시됩니다. ,이 파일은 Apache POI로 작성한 것보다 Excel 2007입니다. 파일은 폴더 "D : \ jboss-6.1.0.Final \ bin"에 올바르게 저장되지만 이상한 기호와 문자을 사용하여 페이지로 리다이렉트하는 "다른 이름으로 저장"창이 표시됩니다.Java에서 Excel 파일을 다운로드 할 때 "다른 이름으로 저장"창이 표시되지 않지만 파일이 올바르게 저장되었습니다.

가장 이상한 것은 내 앱의 다른 페이지에서 Excel의 파일을 다운로드하는 다른 버튼이 있고 POI와 동일한 코드 y와 함께 "다른 이름으로 저장"이 정상적으로 나타납니다.

왜 발생합니까 ???

감사합니다.

이미지를 첨부합니다. enter image description here

함수 수출의 코드는 다음과 같습니다

public void exportarTabla(){ 

    XSSFWorkbook workbook = new XSSFWorkbook(); 
    XSSFSheet sheet = workbook.createSheet("Hoja 1");   
    XSSFRow row; 
    XSSFCell cell; 

    for (int i = 0; i < getLstEtiquetasCol().size(); i++) { 
     row = sheet.createRow(i+3); 
     for (int j = 0; j < getLstEtiquetasCol().get(i).size(); j++) { 
      cell = row.createCell(j+3+getLstEtiquetasFil().get(0).size()); 
      cell.setCellValue(getLstEtiquetasCol().get(i).get(j).getValor().getEtiqueta());     
     } 
    } 


    for (int i = 0; i < getLstEtiquetasFil().size(); i++) { 
     row = sheet.createRow(i+3+getLstEtiquetasCol().size()); 
     for (int j = 0; j < getLstEtiquetasFil().get(i).size(); j++) { 
      cell = row.createCell(j+3); 
      cell.setCellValue(getLstEtiquetasFil().get(i).get(j).getValor().getEtiqueta()); 
     } 
    } 


    for (int i = 0; i < getTableContact().size(); i++) { 
     row = sheet.getRow( i+3+getLstEtiquetasCol().size()); 
     for (int j = 0; j < getTableContact().get(i).size(); j++) { 
      cell = row.createCell(j+3+getLstEtiquetasFil().get(0).size()); 
      cell.setCellValue(Double.parseDouble(getTableContact().get(i).get(j).getEtiqueta()));     
     } 
    } 


    try { 

     this.archivo_salida = "D:/jboss-6.1.0.Final/bin/output2.xlsx"; 
     FileOutputStream fileOut = new FileOutputStream(new File(archivo_salida)); 
     workbook.write(fileOut); 

     if(fileOut != null){ 
      try{ 
       File ficheroXLS = new File(archivo_salida); 
       FacesContext ctx = FacesContext.getCurrentInstance(); 
       FileInputStream fis = new FileInputStream(ficheroXLS); 
       byte[] bytes = new byte[1000]; 
       int read = 0; 

       if (!ctx.getResponseComplete()) { 
        String fileName = ficheroXLS.getName(); 
        String contentType = "application/vnd.ms-excel"; 
        //String contentType = "application/pdf"; 
        HttpServletResponse response =(HttpServletResponse) ctx.getExternalContext().getResponse(); 
        response.setContentType(contentType); 
        response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\""); 
        ServletOutputStream out = response.getOutputStream(); 

        while ((read = fis.read(bytes)) != -1) { 
         out.write(bytes, 0, read); 
        } 

        out.flush(); 
        out.close(); 
        System.out.println("\nDescargado\n"); 
        ctx.responseComplete();      
       }  
      }catch(IOException e){ 
       e.printStackTrace(); 
      } finally { 
       try { 
        if (fileOut != null) { 
         fileOut.close(); 
        }    
       } catch (IOException ex) { 
         ex.printStackTrace(); 
       } 
      } 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

은 web.xml

<?xml version="1.0" ?> 

http://java.sun.com/xml/ns/javaee/web-app_2_5 .XSD " 버전 ="2.5 ">

<!-- RichFaces --> 

<context-param> 
    <param-name>org.richfaces.SKIN</param-name> 
    <param-value>blueSky</param-value> 
</context-param> 

<!-- Suppress spurious stylesheets --> 

<context-param> 
    <param-name>org.richfaces.CONTROL_SKINNING</param-name> 
    <param-value>disable</param-value> 
</context-param> 

<context-param> 
    <param-name>org.richfaces.CONTROL_SKINNING_CLASSES</param-name> 
    <param-value>disable</param-value> 
</context-param> 

<!-- Change load strategy to DEFAULT to disable sending scripts/styles as 
    packs --> 

<context-param> 
    <param-name>org.richfaces.LoadStyleStrategy</param-name> 
    <param-value>ALL</param-value> 
</context-param> 

<context-param> 
    <param-name>org.richfaces.LoadScriptStrategy</param-name> 
    <param-value>ALL</param-value> 
</context-param> 

<!-- Seam --> 

<listener> 
    <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> 
</listener> 

<filter> 
    <filter-name>Seam Filter</filter-name> 
    <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> 

    <init-param> 
     <param-name>maxRequestSize</param-name> 
     <param-value>1000000</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>Seam Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<servlet> 
    <servlet-name>Seam Resource Servlet</servlet-name> 
    <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Seam Resource Servlet</servlet-name> 
    <url-pattern>/seam/resource/*</url-pattern> 
</servlet-mapping> 

<!-- Facelets development mode (disable in production) --> 

<context-param> 
    <param-name>facelets.DEVELOPMENT</param-name> 
    <param-value>@[email protected]</param-value> 
</context-param> 

<!-- JSF --> 

<context-param> 
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
    <param-value>.xhtml</param-value> 
</context-param> 

<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.seam</url-pattern> 
</servlet-mapping> 

<security-constraint> 
    <display-name>Restrict raw XHTML Documents</display-name> 
    <web-resource-collection> 
     <web-resource-name>XHTML</web-resource-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </web-resource-collection> 
    <auth-constraint /> 
</security-constraint> 

<persistence-unit-ref> 
    <persistence-unit-ref-name>demoencuesta06/pu</persistence-unit-ref-name> 
    <persistence-unit-name>demoencuesta06</persistence-unit-name> 
</persistence-unit-ref> 

,
+0

관리 빈과 페이지 조각에서 코드를 게시 할 수 있습니까? –

+0

이 함수 ExportarTAbla()는 bean의 일부이고 파일은 dndBean.java입니다. 비아에서 무엇을보고 싶니? 내가 원하는 부분을 게시 할 수 있습니다. – Sisi002

답변

0

첫 번째 :이 보고서에 액세스하는 사람이 한 명만있는 경우가 아니라면 고정 경로를 사용하면 같은 시간에 두 개의 요청 (결과를 알 수없는 경우)이 발생하는 경우가 대부분입니다. 파일을 보거나 상대방의 데이터를 볼 수 있습니다. 경우에 따라 파일이 손상 될 수 있습니다.

당신은 (당신이 java.io.File.createTempFile (문자열 "3 문자 분", 문자열 ".XLS" 파일 directoryOnServer을 사용할 수 있습니다) 서버에 임의의 이름으로 데이터를 저장해야

이제 새 파일을 만든 후 버튼을 클릭 한 다음 페이지에서 콘텐츠 유형을 응용 프로그램으로 설정해야합니다. 출력 전에는 출력해야하며 출력은 이진 데이터 여야합니다. 부자에 대해서는 잘 모릅니다. jsps에서 사람들은 jsp 태그 사이의 헤더에 새로운 라인을 삽입하는 것을 보았습니다.

<%@ page import="sel2in.prjx.conf.*, sel2in.urlShorten.data.*, sel2in.prjx.common.*"%> 
<% 
///this is bad : new line after %> 
     response.setHeader("pragma","No-cache"); 

풍부한 얼굴 File download using RichFaces

(가 복사 미만) 파일 이름에있는 경우, 컨텐츠 유형 설정에 관해서는

<h:commandLink value="Download" action="#{appController.downloadFile}" 
rendered="#{!file.directory}"> 
<f:param name="file" value="#{file.absoluteFilename}" /> 
</h:commandLink> 

참조하십시오 올바른 방법

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <% response.setContentType("application/vnd.ms-excel"); %><%@ page import="sel2in.prjx.conf.*, sel2in.urlShorten.data.*, sel2in.prjx.common.*"%><%  
///this is okay : No new line after %> 
     response.setHeader("pragma","No-cache");  

확장 기능을 손쉽게 사용하려면 ServletContext # getMimeType()을 사용하여 web.xml (서버의 기본 웹 애플리케이션 또는 웹 애플리케이션의 기본 웹 애플리케이션)에 기반하여이를 해결할 수 있습니다.

ServletContext servletContext = (ServletContext) externalContext.getContext(); 
String contentType = servletContext.getMimeType(file.getName()); 

if (contentType == null) { 
    contentType = "application/octet-stream"; 
} 

response.setContentType(contentType); 
// ... 

(참고로 이것은 JSF 1.x 용이므로 JSF 2부터 가능합니다.그렇지 않으면 ExternalContext # getMimeType()을 사용하십시오.

+0

어쨌든 나는 RichFaces로 시도 할 것이지만 동일한 코드는 내가 만든 파일을 다운로드 할 때 다른 엑셀 파일로 작동한다. web.xml의 코드가 불완전하다고 생각하십니까? 아마도 web.xml에서 무언가를 바꿀 수도 있습니다. web.xml 파일을 추가했습니다. – Sisi002

1

답변을 주셔서 감사합니다. 문제가 발견되었습니다. 파일의 .xhtml에 ajax가있는 버튼이 있습니다. 그것은이었다

<a4j:commandButton id="btnexportar" onclick="this.disabled=true" oncomplete="this.disabled=false; alert('La Exportacion de Datos ha finalizado')" 
          action="#{dndBean.exportarTabla}" 
          value="Exportar Datos"> 
</a4j:commandButton> 

그리고 난으로 변경 :

<h:commandButton id="generarinforme" action="#{dndBean.exportarTabla}"        
           value="Exportar Datos"> 
</h:commandButton> 

그리고 stranges 문자 더 이상 나타나지 않습니다. 이제는 onclick과 oncomplete를 사용하는 방법을 찾아야합니다. 감사!

+0

덕분에 나는 당신을 전혀 도와주지 않았던 것처럼 보입니다! 지금은 아약스를 거치지 않은 것을 제외하고는? 나는 당신이 아약스를 통해 효과를 발휘할 수 있다고 생각하며 왜 그렇게하고 싶습니까? – tgkprog

0

그냥 다섯 가지

을 1.Search 에 대한 ajaxSingle = "true"로하고 ajaxSubmit = "true"를 형태로.

2.이 둘을 삭제하십시오.

3. h : commondLink을 사용하여 서버 또는 로컬 디렉토리에서 파일을 다운로드하십시오.

4. 콘텐츠 형식이 파일 형식과 일치하는지 확인하십시오.

5.form 타겟은 "_blank"이거나 사용하지 않아야합니다.