2011-04-21 3 views
1

Java를 사용하여 REST 웹 서비스에 업로드 파일에 문제가 있습니다. 소스 파일을 가져 오는 방법을 모르겠습니다. 컬 명령은 내 질문에 사람이 소스 파일의 URL "/ 홈/student1/텍스트 1을 얻는 방법을 알고있다 http://localhost:20260/project/resources/user1/sub-folder/text1.txt파일 업로드를 위해 HttpRequest에서 소스 파일을 가져 오는 방법

/home/student1/text1.txt 그

컬의 --upload 파일과 같다. txt "REST 웹 서비스 @PUT 메서드 또는 다른 방법으로 그것을 얻으려면?

감사

+1

해당 파일이 클라이언트 컴퓨터에 있으므로 서버에서 액세스 할 수 없거나 파일이 누락 되었습니까? – Milimetric

+0

하지만 inorder 파일을 업로드하려면 URL을 알아야합니다. 맞습니까? BufferedReader = new BufferedReader (새로운 FileReader ("/ home/student1/text1.txt");) 읽을 수 있도록 Coz 웹 서비스를 처음 접했습니다. 서버 쪽과 클라이언트 쪽을 혼동합니다. – sudo

+0

파일이 나타납니다. 멀티 파트 양식의 일부인 HTTP 요청. HTTP 작동 방식 (GET, POST, DELETE 요청 및 응답)을 배우는 데 시간을 할애해야합니다. 오늘날 세계에서 그 값은 매우 유용합니다. – Milimetric

답변

2

나는 curl이 mltipart/form-data를 업로드의 콘텐츠 유형으로 사용한다고 가정합니다. 파일 이름은 첫 번째 MIME 부분의 Content-Disposition 헤더의 일부입니다.

+1

'--upload-file' 옵션은 파일의 내용을 multipart/form-data 형식으로 HTTP PUT 요청의 본문으로 전송하도록 지시합니다. – laz

+0

고마워. 이 경우 원본 파일 이름 –

+0

hi laz를 전송하는 표준 메커니즘이 없으므로 PUT 요청에서 파일의 내용을 가져 오는 방법을 알고 있어야합니다. 감사합니다 – sudo

2

I 해요 정말 JAX-RS에 대해 잘 알고 있지만, 나는 다음과 같은 코드가 당신이 찾고있는 무엇을하지 생각하지 :

package org.restlet.example; 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URISyntaxException; 
import java.util.HashMap; 
import java.util.Map; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.PUT; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.HttpHeaders; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.UriInfo; 

@Path("project/resources/{user}/{directory}/{filename}") 
public class JaxRsResource { 
    private static final int BLOCK_SIZE = 8192; 
    private static final Map<String, MediaType> MEDIA_TYPE_MAP = new HashMap<String, MediaType>(); 

    @Context 
    private UriInfo uriInfo; 

    @Context 
    private HttpHeaders httpHeaders; 

    @PathParam("user") 
    private String user; 

    @PathParam("directory") 
    private String directory; 

    @PathParam("filename") 
    private String filename; 

    @QueryParam("name") 
    private String name; 

    @QueryParam("type") 
    private String type; 

    static { 
     MEDIA_TYPE_MAP.put("txt", MediaType.TEXT_PLAIN_TYPE); 
     MEDIA_TYPE_MAP.put("gif", MediaType.valueOf("image/gif")); 
     MEDIA_TYPE_MAP.put("jpg", MediaType.valueOf("image/jpeg")); 
     MEDIA_TYPE_MAP.put("png", MediaType.valueOf("image/png")); 
     MEDIA_TYPE_MAP.put("zip", MediaType.valueOf("application/zip")); 
    } 

    public JaxRsResource() { 
    } 

    @PUT 
    @Consumes({"text/plain", "image/jpeg", "image/png", "image/gif", "application/zip"}) 
    public Response upload(final byte[] contents) throws IOException, URISyntaxException { 
     FileOutputStream output = null; 
     try { 
      final File directories = new File(user, directory); 
      directories.mkdirs(); 
      final File file = new File(directories, filename); 
      output = new FileOutputStream(file); 
      output.write(contents); 
     } finally { 
      if (output != null) { 
       output.flush(); 
       output.close(); 
      } 
     } 
     return Response.created(uriInfo.getAbsolutePath()).build(); 
    } 

    @GET 
    @Produces({"text/plain", "image/jpeg", "image/png", "image/gif", "application/zip"}) 
    public Response output() throws IOException { 
     final String extension = filename.substring(filename.lastIndexOf('.') + 1); 
     final ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     InputStream input = null; 
     try { 
      input = new FileInputStream(new File(new File(user, directory), filename)); 
      final byte[] buffer = new byte[BLOCK_SIZE]; 
      int read = 0; 
      while ((read = input.read(buffer)) > -1) { 
       output.write(buffer, 0, read); 
      } 
     } finally { 
      if (input != null) { 
       input.close(); 
      } 
     } 
     final byte[] byteArray = output.toByteArray(); 
     output.flush(); 
     output.close(); 
     return Response.ok(byteArray, MEDIA_TYPE_MAP.get(extension)).build(); 
    } 

} 

내가 노력에 대한 안전하다는 것을 확인하지 않은 user 또는 directory 중 하나로 ..을 입력하면 입력 위생이 필요할 수 있습니다. 또한 오류 및 예외를보다 잘 처리해야합니다.

나는이를 curl로 테스트했으며 --upload-file을 통해 전달 된 파일의 내용을 포함하는 서버 파일 시스템에 파일을 생성하고 동일한 리소스에 GET을 실행하여 검색 할 수 있습니다. 그래도 난 그것을 작업을 얻을 수있는 컬 요청에 Content-Type 헤더를 추가 할 필요가 않았다

curl -v -T test.txt -H "Content-Type: text/plain" http://localhost:8182/project/resources/user1/sub-folder/test.txt 

나는 JAX-RSRestlet's 구현을 사용하여 이것을 테스트했습니다.

이 새 버전은 다른 의견에서 언급 한 쿼리 매개 변수를 지원하는 추가 요구 사항을 처리합니다. 인수 목록이 다루기 힘들어지기 때문에 메서드 인수 대신 속성을 사용하도록 리팩터링했습니다. JAX-RS 스펙에서 그렇게하는 것이 안전하다는 것을 알게되었습니다. 또한 다른 파일 인코딩으로 시도하지는 않았지만 일반 텍스트 및 이진 파일을 지원하도록 코드를 수정했습니다. 메소드가 바이트 배열 입력을 기대하고 있기 때문에 JAX-RS 프레임 워크가 올바른 일을하고 요청의 Content-Type 헤더에 JAX-RS 프레임 워크가 제공되면 사용할 인코딩을 알 수 있기를 바랍니다.

+0

내가 원했던 대답인데, laz, 고마워. – sudo

+0

안녕 laz, 사진 및 zip 파일을 업로드하는 중 오류가 있습니다. 해결 방법을 알고 있습니까? – sudo

+0

아마도 콘텐츠를 수정해야합니다. -Type. 내가 제공 한 예제는 Content-Type text/plain에 대해서만 작동하며 Writer 및 Reader 개체를 사용하면 이미지 나 zip 파일과 같은 바이너리 데이터에는 사용할 수 없으므로 OutputStream 및 InputStream ob jects. – laz

관련 문제