File upload com.sun.jersey.api.client.UniformInterfaceException(返回的响应状态为400)

File upload com.sun.jersey.api.client.UniformInterfaceException(返回的响应状态为400),file-upload,jersey,jax-rs,File Upload,Jersey,Jax Rs,我正在尝试使用JAX RS设置文件上载示例。我可以设置项目并在服务器位置成功上载文件。但当文件大小超过10KB时,我会出现以下错误 我是JAX-RS新手,我不确定到底是什么问题。我是否需要在客户端或服务器端设置一些参数,如大小、超时等 这是调用webservice的客户端代码: public void upload() { File file = new File(inputFilePath); FormDataMultiPart part = new FormDataMulti

我正在尝试使用JAX RS设置文件上载示例。我可以设置项目并在服务器位置成功上载文件。但当文件大小超过10KB时,我会出现以下错误

我是JAX-RS新手,我不确定到底是什么问题。我是否需要在客户端或服务器端设置一些参数,如大小、超时等

这是调用webservice的客户端代码:

public void upload() {
    File file = new File(inputFilePath);
    FormDataMultiPart part = new FormDataMultiPart();
    part.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE));
    WebResource resource = Client.create().resource(url);
    String response = resource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(String.class, part);
    System.out.println(response);
}
这是服务器端代码:

@Path("/file")
public class UploadFileService {

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) {

    String uploadedFileLocation = "e://uploaded/"
            + fileDetail.getFileName();

    writeToFile(uploadedInputStream, uploadedFileLocation);

    String output = "File uploaded to : " + uploadedFileLocation;

    return Response.status(200).entity(output).build();

}

private void writeToFile(InputStream uploadedInputStream,
        String uploadedFileLocation) {

    try {
        OutputStream out = new FileOutputStream(new File(
                uploadedFileLocation));
        int read = 0;
        byte[] bytes = new byte[16000];

        out = new FileOutputStream(new File(uploadedFileLocation));
        while ((read = uploadedInputStream.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        out.flush();
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    } } } 
请让我知道对于大于10KB的文件,我必须更改哪些设置


谢谢

我在Jersey上下文中使用org.apache.commons.fileupload.servlet.ServletFileUpload,它工作正常。是的,它设置了最大文件大小,很抱歉我以前错过了这个

这是我使用的一段代码,这是一个多部分表单,所以文件中还有其他字段

private LibraryUpload parseLibraryUpload(HttpServletRequest request) {
LibraryUpload libraryUpload;

File libraryZip = null;
String name = null;
String version = null;

ServletFileUpload upload = new ServletFileUpload();
upload.setFileSizeMax(MAX_FILE_SIZE);

FileItemIterator iter;
try {
  iter = upload.getItemIterator(request);
while (iter.hasNext()) {
....
if (item.isFormField()) {
....
}else{
BufferedInputStream buffer = new BufferedInputStream(stream);
      buffer.mark(MAX_FILE_SIZE);
      libraryZip = File.createTempFile("fromUpload", null);
      IOUtils.copy(buffer, new FileOutputStream(libraryZip));
...
}

我在泽西遇到了同样的问题。我已经激活了jersey trace,但没有任何帮助

我已经通过apache库更改了库,我看到了链接到tomcat临时文件存储库的问题。存储库不存在。对于10k以下的文件,未使用存储库


因此,在创建存储库之后,我使用了jersey library,一切都很好。

Hi Samuel,我分别尝试了writeToFile方法中的代码,效果很好。我不知道这是什么,你用的是什么版本的球衣?我做文件上传,但我的代码是相当不同的,我使用泽西1.12。你也可以取代e.printStackTrace;使用一些日志并返回Response.statusStatus.INTERNAL_SERVER_ERROR.build;如果发生这种错误,可能有助于理解问题。如果您的代码在我看来还行,我只能建议您切换到jersey 1.12,如果可能的话,如果您发现意外异常,请像前面所说的那样抛出错误500,然后查看发生了什么情况。Hi Samuel,jersey 1.12也存在同样的问题。我认为问题在于加载文件客户端时,因为对于文件大小大于10kb的post请求,它没有进入webservice方法本身。
private LibraryUpload parseLibraryUpload(HttpServletRequest request) {
LibraryUpload libraryUpload;

File libraryZip = null;
String name = null;
String version = null;

ServletFileUpload upload = new ServletFileUpload();
upload.setFileSizeMax(MAX_FILE_SIZE);

FileItemIterator iter;
try {
  iter = upload.getItemIterator(request);
while (iter.hasNext()) {
....
if (item.isFormField()) {
....
}else{
BufferedInputStream buffer = new BufferedInputStream(stream);
      buffer.mark(MAX_FILE_SIZE);
      libraryZip = File.createTempFile("fromUpload", null);
      IOUtils.copy(buffer, new FileOutputStream(libraryZip));
...
}