내 웹 사이트를 통해 내 웹 사이트에서 원격 서버에 파일을 업로드 할 수 있습니다. 서버에 파일 이름에 문제를 방지하기 위해, 내가 서버에 업로드 된 파일의 이름을 간단한 규칙을 적용 할 : 자신의 악센트가없는 동등한에 의해Java에서 String을 정규화 할 때 인위적 인코딩.
- 모든 악센트 문자를 교체하십시오 (A, E, è 등) (즉, 우리의 예에서 A, E, E)
- 은 밑줄
- 모든 특수 문자를 대체는
처럼protected String serverFilename(String localFilename) { if (localFilename == null || localFilename.length() == 0) { throw new IllegalArgumentException("Invalid filename for upload (localFilename=" + localFilename + ")"); } String result = Normalizer.normalize(localFilename, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "").replaceAll("[^a-zA-Z0-9.]", "_").toLowerCase(); LOG.debug("filename " + localFilename + " returns: " + result); return result; }
내 코드가 보이는 전체를 소문자
assertEquals("capture_d_ecran_2012_08_02_a_12.45.29.png", uploader.serverFilename("Capture d’écran 2012-08-02 à 12.45.29.png"));
을하지만 실제 행동, 즉, 톰캣 6의 맥 서버, 비슷한 이름의 파일이, 내가이라는 이름을 얻을 'capture_d_ao__cran_2012_07_10에서 로컬로 실행 ____ 10.22.01 :3210
이 단위 테스트는 잘 실행 .png ':
filename Capture d’écran 2012-07-10 à 10.22.01.png returns: capture_d_ao__cran_2012_07_10____10.22.01.png
어딘가에 잘못된 인코딩이있는 것 같지만 어디서 그런 생각이 들지는 않습니다. 어떻게 해결할 수 있을지 알려주세요.
업데이트 : Java 소스 파일과 파일 업로드를 담당하는 HTML은 모두 UTF-8로 인코딩됩니다.
http://stackoverflow.com/questions/3665682/utf-8-encoding-and-http-parameters : 필터를 만들고이를 web.xml에 저장하여 모든 hTTP 통신을 UTF-8로 인코딩합니다. 트릭을 했어. 감사! –