2010-07-19 2 views
4

배경 :Java : 파일을 업로드하고 다운로드하는 동안 특수 문자를 파일 이름에 사용하는 방법은 무엇입니까?

내가 파일의 링크는 데이터베이스에 저장되고 실제 파일은 acutal 파일은 파일 시스템에 저장하지이 과정에서, 내가 업로드 한 파일을 가지고 현재를 저장입니다 내 로컬 컴퓨터에서.

는 목표 : - #,$,%,@ etc

내 목표는 파일을 업로드하고 거기에 특수 문자가있는 제대로 파일을 다운로드하는 것입니다.

문제 :

내가 특수 문자를 사용하여 파일을 업로드 할 수 있어요하지만 특수 문자 파일을 다운로드 할 수 없습니다입니다. 또한 Download Servlet의 변경 사항은 Framework의 일부이므로 수행 할 수 없으므로 Upload Servlet입니다. 따라서 특수 문자를 사용하여 파일을 업로드하여 다운로드 할 수 있습니다.

특수 문자를 '_' 기호로 바꾸는 파일 이름의 별칭을 만들려고 시도했지만이 접근 방식은 제대로 작동하지만 파일을 다운로드 할 수 있지만 파일의 실제 이름은 여기에 유지되지 않습니다. 파일 이름은 '_' 기호로 바뀌며 사용자가 파일의 실제 이름이어야하므로 허용되지 않습니다.

어떤 제안이나 접근 방식 :

코드 :

public ModelAndView save(HttpServletRequest request, HttpServletResponse response, Object command, 
         ModelAndView modelView, BindException errors) throws Exception { 

String newFileName = checkForSpecialCharsAndGetNewFileName(file.getOriginalFilename()); 
System.out.println("alias filename="+ newFileName); 
String url = "f" + (String.valueOf(System.currentTimeMillis())) + "_" + newFileName; 
String fileName = file.getOriginalFilename(); 
System.out.println("FileName "+ fileName); 
} 

//Code to replace all special characters in the incoming file with '_' symbol. 
private String checkForSpecialCharsAndGetNewFileName (String originalFileName) { 
    final String[] splChars = {"#", "+", "$"}; 
    String newString = originalFileName; 
    for (int i=0; i<splChars.length; i++) 
    newString = StringUtils.replace(newString, splChars[i], "_"); 
    return newString; 
} 

희망이 여기에 어떤 의미를 만들고있다.

감사합니다.

+0

저는 스프링을 사용하지 않고 정확하게 클라이언트 측에서 사용하는 방법이 명확하지 않으므로 자세히 설명 할 수는 없지만 언급 된 문자는 URL의 예약 문자이므로 필요합니다. URL 인코딩이 제대로되어 있어야합니다. – BalusC

+0

스프링 프레임 워크를 사용하여 URL을 인코딩하는 방법을 잘 모르겠습니다. Spring.From 클라이언트 측에서는 추가 프로세싱을 수행하는 서블릿 (업로드 및 다운로드 서블릿)에 대한 참조를 만들고 있습니다. – Rachel

+0

또한 URlEncoder를 사용하여 URL을 인코딩하더라도 특수 문자가 포함 된 파일을 다운로드 할 수없는 경우에도 가능한 이유가 무엇인지 알 수 없습니다. – Rachel

답변

2

정확하게 이해했다면 파일 이름을 인코딩 할 때 파일을 업로드 할 때 나중에 다운로드 할 때 파일 이름에서 같은 파일을 찾을 수 있기를 원합니다.

이렇게하려면 URLEncoderURLDecoder 클래스를 사용할 수 있습니다.

String fileName; 
fileName = URLEncoder.encode("My ! String #", "UTF-8"); 

를 인코딩합니다

당신은 다음과 같은이 일을 뭔가를 할 수 있습니다. 원본 파일 이름을 얻으려면 다음과 같이하십시오.

String originalFileName = URLDecoder.decode(fileName, "UTF-8"); 

인코딩 된 파일 이름을 사용하여 서비스에서 파일을 다운로드 할 수 있습니다. 그런 다음 파일 이름을 디코딩하여 적절히 저장할 수 있습니다.

희망이 있습니다.

+0

이것이 내가 바라는 부분이지만, 내가 말했듯이 프레임 워크의 일부인 다운로드 서블릿을 수정할 수는 없습니다. 난 그냥 jsp 파일에서 서블릿을 다운로드하는 참조하는 데, 그래서 심지어 내가 서블릿을 다운로드 디코딩 할 수없는 것보다 업로드 서블릿에서 인코딩 오전, 내가 어떻게 든 JSP로 파일에 논리를 디코딩 할 수있는 방법입니다 서블릿 다운로드를 요청 하시겠습니까? – Rachel

+0

다운로드 서블릿을 호출 할 때 파일 이름을 보내지 않습니까? 그렇다면 파일 이름을 보내기 전에 인코딩 할 수 있습니다. 그렇지 않다면 서블릿은 다운로드 할 파일 이름을 어떻게 얻고 있습니까? – aperkins

+0

'Download  '는 다운로드 서블릿을 호출하고 jsp 페이지를 통해 url 정보를 전달합니다. – Rachel

3

java.io.File 클래스가 생성자에서 전달 된 파일 이름에 포함 된 틸트를 자동 인코딩하기 시작한 경우에 문제가 있습니다.

그래서 예를 들어, 당신은 내부적 "%7Efilename"로 해석됩니다 "~filename"을 사용하여 파일을 인스턴스화 그래서 만약 당신이 읽거나라는 이름의 파일에 기록해야하는 경우 "~filename" 그것을 할 방법이 없다.

Tomcat 서버에 새로운 Xalan/Xerces jar (전체 5 세트)를 보증했을 때 문제가 발생했습니다. 보증 된 항아리를 제거하면 문제는 즉시 해결됩니다 (그림 참조).

문제가 이와 비슷한 경우 서버가 승인 된 XML 구문 분석 항아리를 사용하고 있는지 확인하고이를 제거하는 것이 좋습니다. 새로운 xerces jar 파일을 java.io.File로 잘 만들 수있는 방법을 찾지 못했거나 심지어 여기에 영향이있는 이유를 이해합니다.

관련 문제