2014-07-14 1 views
3

나는 파일 업로드를 위해 다음 코드를 사용하고 있습니다 :RestEasy 파일 업로드 - 파일 이름 인코딩을 올바르게 올바르게 결정합니까?

@Path("/files/") 
@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public OrderData uploadFile(MultipartFormDataInput input) { 
    List<InputPart> parameterParts = input.getFormDataMap().get("Filename"); 
    String filename = parameterParts.get(0).getBody(String.class, null); 
    ... 
} 

그것은 라틴어 문자에 대한 확인을 작동하지만 (내가 알고있는 것처럼 기본적으로 자바는 유니 코드에 rawpost 데이터 인코딩 때문에)

을 내가 키릴 에 문제가

게시물을 올바른 Java 문자열로 올바르게 인코딩하고 인코딩 할 수 있습니까?

답변

3

당신이 모든 부분에 대한 인코딩과 콘텐츠 형식을 지정할 수 있습니다 multipart/form-data를 사용 : 당신은 (적어도 현재 것이 밖으로 상자의 작동해야 모든 부분이 콘텐츠 형식을 추가하는 경우

POST /some-resource HTTP/1.1 
Content-Type: multipart/form-data; boundary=AaB03x 

--AaB03x 
Content-Disposition: form-data; name="file"; filename="file1.txt" 
Content-Type: text/plain; charset=utf-8 

... contents of file1.txt ... 
--AaB03x-- 

을 RESTeasy 버전 3.0.x). 당신은 RESTEasy가 클라이언트와이를 테스트 할 수 있습니다 : 클라이언트가 당신에게 당신이 사용자 정의 헤더에 따라 예를 들어 change the default encoding을 할 수있는 부분 당 콘텐츠 유형을 설정할 수있는 가능성을 제공하지 않는 경우

WebTarget target = client.target("/some-resource"); 
MultipartFormDataOutput formData = new MultipartFormDataOutput(); 
formData.addFormData("file", fileContent, MediaType.TEXT_PLAIN_TYPE.withCharset("utf-8")); 
Entity<MultipartFormDataOutput> entity = Entity.entity(formData, MediaType.MULTIPART_FORM_DATA); 
Response response = target.request().post(entity); 

(I가 수정 된 코드를 추가 해요 -example PreProcessInterceptor 때문에) @deprecated을 표시됩니다 : 당신은 일반 HTML 양식을 사용하는 경우

@Provider 
public class CharsetFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     String charset = requestContext.getHeaderString("X-Charset"); 
     if (charset != null) { 
      requestContext.setProperty(InputPart.DEFAULT_CHARSET_PROPERTY, charset); 
     } 
    } 

} 

당신이 양식에 <input type="hidden" name="_charset_" />을 추가 할 수 있습니다. 클라이언트는 multipart/form-data encoding algorithm에 정의 된대로이 필드를 사용중인 charset으로 채 웁니다. 그런 다음 자신의 ResourceClass에 콘텐츠를 인코딩해야합니다.

@POST 
@Path("/form") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.TEXT_PLAIN) 
public Response uploadForm(MultipartFormDataInput input) throws IOException { 
    String charset = input.getFormDataMap().get("_charset_").get(0).getBodyAsString(); 
    InputPart file = input.getFormDataMap().get("file").get(0); 
    InputStream inputStream = file.getBody(InputStream.class, null); 
    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, charset)); 
    String line; 
    StringBuilder content = new StringBuilder(); 
    while ((line = br.readLine()) != null) { 
     content.append(line); 
    } 
    return Response.ok(content).header("Content-Type", MediaType.TEXT_PLAIN_TYPE.withCharset(charset)).build(); 
} 
관련 문제