Java REST - 正确的JQuery multipart / form-data文件上传参数?

时间:2013-03-01 12:21:47

标签: java rest jersey resteasy

我们在Safari 5.x的网站文件上传功能中遇到了问题。

JQuery通常将文件作为文件发送到REST服务,并且分配了正确的Content-Type(例如image / png),但是对于Safari 5.x,它似乎只能将其作为“multipart / form-data”发送

我尝试通过Jersey和RestEasy添加新端点来接受这个,但我没有成功。

我认为问题很简单,我无法确定参数应该是什么。无论我尝试什么,它似乎都会产生415响应。

客户端发送的请求(我无法控制)如下所示: 注意:它只是一个文件,但似乎支持多个。

标题

Accept:application/json, text/javascript, */*; q=0.01
Content-Type:multipart/form-data; boundary=----WebKitFormBoundary15QUDazCkPkvqWTQ
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2

有效载荷

------WebKitFormBoundary15QUDazCkPkvqWTQ
Content-Disposition: form-data; name="files[]"; filename="myFile.png"
Content-Type: image/png


------WebKitFormBoundary15QUDazCkPkvqWTQ--

我在API方面尝试了以下两种方法:

泽西

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadMultipart(FormDataMultiPart multiPart) throws IOException{ 

    List<FormDataBodyPart> fields = multiPart.getFields("files");        
    for(FormDataBodyPart field : fields){
        InputStream inputStream = field.getValueAs(InputStream.class);
    }

    // respond...
}

RestEasy的

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadMultipart(@MultipartForm UploadForm form) {

    System.out.println(form.getFile().length);
    System.out.println(form.getName());

    //respond...
}



public class UploadForm {

    private String name;
    private File file;  /// Have tried various Objects & Arrays here - all with no success;

    @FormParam("filename")
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @FormParam("files")
    public void setFile(File file) {
        this.file = file;
    }

    public File[] getFile() {
        return file;
    }
}

有人可以指出我错了吗?我宁愿坚持使用泽西岛,但是对于任何有效的解决方案都很满意。

1 个答案:

答案 0 :(得分:0)

我使用Jersey,但我从未尝试使用@MultipartForm UploadForm表单

我的参数是:

@Context final HttpServletRequest request

你可以这样使用它(但这对你的使用可能有点过分):

final ServletFileUpload upload = new ServletFileUpload();
final FileItemIterator iter = upload.getItemIterator(request);

 while (iter.hasNext()) {
        //You should have only one element, but you may have several as multipart content
        final FileItemStream item = iter.next();

        final String name = item.getFieldName();
        final InputStream stream = item.openStream();
        //... and here you've got your inputstream
}