2012-03-06 3 views
0

파일 업로드 할 때이 코드가 예상과 그 콘텐츠 유형, 그들은 일전에 잘 작동했지만 지금은 그들이 제대로 작동하지 않는 이유를 이해할 수 없습니다.콘텐츠 유형은 엑셀

+0

* 이전보다 잘 작동했습니다. – pap

+0

@pap 얼마전에 잘 일했다고 들었지만 방금 프로젝트 작업을 시작했습니다 ... –

답변

2

클라이언트 측 문제입니다. UploadedFile#getContentType()은 클라이언트가 multipart/form-data 부분의 Content-Type 헤더 필드에서 보낸 모든 것을 반환합니다. 분명히 문제의 클라이언트는 업로드 된 파일의 파일 확장명과 연결된 MIME 형식이 없습니다. 클라이언트에 MS Excel이 설치되어 있지 않으면 이런 일이 발생할 수 있습니다.

서버가 되어도 파일 확장자를 기준으로 ExternalContext#getMimeType()에 따라 MIME 유형을 결정할 수 있습니다. 또는 고대 JSF 1.x에서 여전히 ServletContext#getMimeType() 인 경우 MIME 유형을 결정할 수 있습니다.

String filename = FilenameUtils.getName(uploadedFile.getName()); // This is available by Commons IO which you should already have. 
String mimetype = FacesContext.getCurrentInstance().getExternalContext().getMimeType(filename); 
// ... 

MIME 타입 정보에 web.xml<mime-mapping> 엔트리로부터 얻어진다. servletcontainer는 자신의 기본값 인 web.xml에 전체 목록을 가지고 있습니다 (예를 들어 Tomcat의 경우 /conf 폴더에서 찾을 수 있습니다). 당신은/확장하여 웹 애플리케이션의 XLSX에 대한 다음과 같은 자신의 web.xml에서 그것을 대체 할 수 있습니다 :이 검출은 순수하지 파일 내용에 파일 확장자를 기반으로한다는

<mime-mapping> 
    <extension>xlsx</extension> 
    <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type> 
</mime-mapping> 

참고. 따라서 클라이언트가 파일 확장명을 편집 할 때 잘못된 검색을 방지 할 수 없습니다. 가장 신뢰할 수있는 것은 Apache POI 나 JExcelAPI와 같은 실제 Excel 파일 파서를 사용하여 구문 분석하고 파싱하는 동안 예외가 발생하지 않는지 확인하는 것입니다.

+0

나는 그것을 고치는 방법에 이미 대답했습니다. 결국 클라이언트 관련 데이터에 의존하지 않아야합니다. 또한 모든 웹 페이지 방문객에게 MS Office가 설치되어 있어야합니다. 어리석은 실수, 교훈을 얻었습니다. 총알을 물고, 즉시 수정하고 다음 번에 기억하십시오. 일어날 수 있습니다 :) 행운을 빌어 요. – BalusC