14

표준 파일 업로드를 위해 Apache Commons Fileupload 도구를 사용하고 있습니다. 내 문제는 특수 문자 (á, é, ú, 등)가 들어있는 경우 업로드 된 파일의 적절한 파일 이름을 가져올 수 없다는 것입니다. 모두가 변환됩니까? 표지판.서블릿 파일 업로드 파일 이름 인코딩

request.getCharacterEncoding()은 UTF-8을 말하지만 fileItem.getName() 문자열에서 가져온 바이트는 모든 모든 특수 문자에 대해 동일합니다.

무엇이 잘못 되었으면 도와 줄 수 있습니까?

(일부 세부 정보 : Windows에서 파이어 폭스 3.6.12, 웹 로직 10.3을 사용하여)

것은이 내 코드입니다 :

당신은 확인해야합니다
public CommandMsg(HttpServletRequest request) { 
    Enumeration names = null; 
    if (isMultipart(request)) { 
     FileItemFactory factory = new DiskFileItemFactory(); 
     ServletFileUpload upload = new ServletFileUpload(factory); 
     try { 
     List uploadedItems = upload.parseRequest(request); 
     Iterator i = uploadedItems.iterator(); 
     FileItem fileItem = null; 
     while (i.hasNext()) { 
      fileItem = (FileItem) i.next(); 
      if (fileItem.isFormField()) { 
      // System.out.println("isFormField"); 
      setAttribute(fileItem.getFieldName(), fileItem.getString()); 
      } else { 
      String enc = "utf-8"; 
      enc = request.getCharacterEncoding(); 
      String fileName = fileItem.getName(); 
      byte[] fnb = fileItem.getName().getBytes(); 
      byte[] fnb2 = null; 
      try { 
       fnb2 = fileItem.getName().getBytes(enc); 
       String t1 = new String(fnb); 
       String t2 = new String(fnb2); 
       String t3 = new String(fnb, enc); 
       String t4 = new String(fnb2, enc); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
      setAttribute(fileItem.getFieldName(), fileItem); 
      } 
     } 
     } catch (FileUploadException ex) { 
     ex.printStackTrace(); 
     } 

// etc.. 
+0

당신이 봤어 호환 인코딩을 취할 것입니다 기본 인코딩을 취할 것입니다 어떤 인코딩 유형을 설정하지 않는 경우

.. 작동하지 않는 것 같다 파일 이름을 디코딩하거나 디코딩하지 않고 파일 이름을 가져 오려면? 널리 사용되는 라이브러리에는 이러한 문제가 있다는 것이 다소 이상합니다. – gigadot

+0

예, 첫 번째 시도가 다음과 같이 표시됩니다. "String fileName = fileItem.getName();" 그것은 나쁘다. 다른 모든 라인들 (t1..4)은 필사적 인 시도 들일뿐입니다. :-) – jabal

답변

11

나는 같은 문제가있어서 이것을 이렇게 풀었다. 당신이 http://commons.apache.org/fileupload/streaming.html에서 제공하는 예에 코드를 기반으로하는 경우

ServletFileUpload upload = new ServletFileUpload(factory); 
upload.setHeaderEncoding("UTF-8"); 

FileItemIterator iter = upload.getItemIterator(request); 
while (iter.hasNext()) { 
    FileItemStream item = iter.next(); 
    String name = item.getFieldName(); 
    InputStream stream = item.openStream(); 
    if (item.isFormField()) { 
     String value = Streams.asString(stream, "UTF-8"); 
    } 
} 

는 당신이 위의 두 곳에서 UTF-8 설정 확인해야합니다.

+0

크리스토프 당신은 내 하루가 만들어 그것은 이러한 상용구 코드를 작성해야하는 유감이지만 잘 작동합니다. 나는 "문제"가 서버 측에있는 동안 html 부분을 보면서 반나절을 보냈다 ...;) –

+3

명시 적으로 스트림을 처리 할 필요가 없으며 단지'FileItem # getString (String)'을 사용할 수있다. 너 어디있어? 인코딩을 예 : "UTF-8":'item.getString ("UTF-8")'. – Svante

3

대상 콘솔/파일/데이터베이스/무엇이든 그 파일 이름을 인쇄/쓰기/삽입하는 곳에서 UTF-8도 지원합니다. 물음표는 UTF-8을 허용하도록 구성되지 않았으며 대상 자체가이를 인식하고 있음을 나타냅니다. 그렇지 않으면 mojibake을 보았을 것입니다.

질문에서 대상에 대한 세부 정보가 누락되었으므로 this article을 통해 자신이 배후에서 문자로 무슨 일이 벌어지고 있는지 이해하는 것 이상을 할 수 없습니다.

+0

당신 말이 맞습니다. 디스플레이 타겟에 관한 정보를 제공하지 않았습니다. 글쎄, Eclipse의 변수보기 (모든 특수 문자는 내 프로그램에서 OK), log4j 로그 파일,이 이름이 삽입 된 데이터베이스, 그리고 마지막으로 파일이 클라이언트로 다시 다운로드 될 때 디버깅하는 동안 의문 부호를 보았습니다. . – jabal

+0

나는 항상 디버깅을 통해 이러한 문제를 검사하기 시작합니다. 시계 창에서 올바른 문자열을 볼 수있는 경우 오류가 발생한 위치를 추적하는 것이 간단합니다. 그러나이 경우에는 파일 이름을 얻는 첫 번째 지점에서 올바르지 않습니다. – jabal

+0

브라우저가 HTTP 헤더에서 해당 메시지의 인코딩을 알 수 있음을 이해합니다. 요청을 구문 분석 할 때이 인코딩을 사용해야합니다. Apache javadoc은 또한 ServletFileUpload.setHeaderEncoding에 대해 다음과 같이 말합니다. "지정되지 않았거나 null 인 경우 요청 인코딩이 사용됩니다." 내 경우 엔 enc = request.getCharacterEncoding(); "UTF-8"이 나오기 때문에 브라우저에서 보내는 것입니다. 하지만 파서가 올바른 파일명을 얻을 수없는 이유는 무엇입니까?:-( – jabal

2

ServletFileUpload 인스턴스의 .setHeaderEncoding ("ISO-8858-2")을 명시 적으로 호출하여 문제를 해결했습니다.

+1

지원되지 않는 ISO-8858-2 대신 ISO-8859-2를 사용하십시오. Java : http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html, 우리는 java.io.UnsupportedEncodingException에 충돌했습니다 : ISO-8858-2 ISO-8858- . 2 인코딩 DiskFileUpload 업로드 = 새로운 DiskFileUpload(); upload.setHeaderEncoding ("ISO-8859-2")는 –

0

이 특수한 charecters의 경우, 인코딩을 "iso 8859-1"로 설정할 수 있습니다. UTF-8 환경을 통해 UR .. 그리고 리눅스 시스템이 UTF-8 및 Windows

관련 문제