如何在HttpRequest中获取源文件以上传文件

我在使用java的REST Web服务中上传文件时遇到问题。 我不知道如何获取源文件。 curl命令就是这样

curl –upload-file /home/student1/text1.txt http:// localhost:20260 / project / resources / user1 / sub-folder / text1.txt

我的问题是,任何人都知道如何在REST Web服务@PUT方法中获取源文件URL“/home/student1/text1.txt”?还是任何其他方式来获取它?

谢谢

我假设curl使用mltipart / form-data作为上传的内容类型。 文件名将是第一个MIME部分的Content-Disposition标头的一部分。

我对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 MEDIA_TYPE_MAP = new HashMap(); @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(); } } 

我还没有证实,对于userdirectory试图放置..是安全的,因此它可能需要输入卫生。 此外,需要更好地处理错误和exception。

我用curl测试了它,它在服务器文件系统上创建了包含通过--upload-file传递的文件内容的--upload-file ,然后可以通过向同一资源发出GET来检索该文件。 我确实必须将内容类型标头添加到curl请求以使其正常工作:

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

我使用Restlet的 JAX-RS实现测试了这一点。

此新版本处理您支持在其他注释中提到的查询参数的其他要求。 我重构它使用属性而不是方法参数,因为参数列表变得越来越笨重。 我从JAX-RS规范中了解到这样做是线程安全的。 此外,我修改了代码以支持纯文本和二进制文件,虽然我没有尝试使用不同的文件编码。 由于该方法需要一个字节数组输入,我希望JAX-RS框架做正确的事情,并且如果在请求的Content-Type头中提供了一个编码,则可以告诉它使用哪个编码。