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-RS의
Restlet's 구현을 사용하여 이것을 테스트했습니다.
이 새 버전은 다른 의견에서 언급 한 쿼리 매개 변수를 지원하는 추가 요구 사항을 처리합니다. 인수 목록이 다루기 힘들어지기 때문에 메서드 인수 대신 속성을 사용하도록 리팩터링했습니다. JAX-RS 스펙에서 그렇게하는 것이 안전하다는 것을 알게되었습니다. 또한 다른 파일 인코딩으로 시도하지는 않았지만 일반 텍스트 및 이진 파일을 지원하도록 코드를 수정했습니다. 메소드가 바이트 배열 입력을 기대하고 있기 때문에 JAX-RS 프레임 워크가 올바른 일을하고 요청의 Content-Type 헤더에 JAX-RS 프레임 워크가 제공되면 사용할 인코딩을 알 수 있기를 바랍니다.
출처
2011-04-21 04:19:51
laz
해당 파일이 클라이언트 컴퓨터에 있으므로 서버에서 액세스 할 수 없거나 파일이 누락 되었습니까? – Milimetric
하지만 inorder 파일을 업로드하려면 URL을 알아야합니다. 맞습니까? BufferedReader = new BufferedReader (새로운 FileReader ("/ home/student1/text1.txt");) 읽을 수 있도록 Coz 웹 서비스를 처음 접했습니다. 서버 쪽과 클라이언트 쪽을 혼동합니다. – sudo
파일이 나타납니다. 멀티 파트 양식의 일부인 HTTP 요청. HTTP 작동 방식 (GET, POST, DELETE 요청 및 응답)을 배우는 데 시간을 할애해야합니다. 오늘날 세계에서 그 값은 매우 유용합니다. – Milimetric