在Java文件中处理从Ajax发送的FormData

时间:2015-01-27 09:24:16

标签: java javascript jquery html ajax

我正在通过Ajax发送文件,如下所示:

// Get the selected files from the input.
  var files = fileSelect.files;

// Create a new FormData object.
  var formData = new FormData();

    // Add the file to the request.
    formData.append('photos[]', files[0], files[0].name);


  $.ajax({
      type:"POST",
      url:"URL,
      dataType:"json",
      headers : {"cache-control":"no-cache"},
      timeout : 12000,
      processData: false,
      data:{
          formdata:formData
     }

现在我想在我的java类中使用send文件,在这样的资源中使用:

@PermitAll
@POST
@Path(URL)
@Produces(MediaType.APPLICATION_JSON)
public Map<String, Object> fileHandler(@FormParam("formdata") File formdata){   }

但是访问该文件不起作用, @FormParam(&#34; formdata&#34;)文件formdata 似乎是错误的(或更多的东西?)。我想以某种方式访问​​我的ressource类中的这个文件。我究竟做错了什么?也许有人知道更好的解决方案。

2 个答案:

答案 0 :(得分:2)

你可以这样处理:

我改变了传递FormData的方式。使用表单的id并将其传递给创建表单数据:

Javacript:

$.ajax({
            type : 'POST',
            url : rquestURL,
            cache:false,
            processData:false,
            contentType:false,
            data : new FormData($("#"+<your_form_id>)[0])}

Rresource(添加@Consumes(MediaType.MULTIPART_FORM_DATA)注释):

@Path("/upload")
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public ResponseDTO doUpload(FormDataMultiPart multiPartData) {

    // non-file fields
    final String imageId = multiPartData.getField("<your_field_name>").getValue();

    // for file field    
    final FormDataBodyPart filePart = multiPartData.getField("<file_field_name>");
    final ContentDisposition fileDetails = filePart.getContentDisposition();
    final InputStream fileInputStream = filePart.getValueAs(InputStream.class);

    // use the above fields as required
    // file name can be accessed from field "fileDetails"  
    }

答案 1 :(得分:1)

当你处理文件时,它不仅仅是FormParam,它还有FormDataParam。
另外,类File用于文件系统中的实体,而不是用于请求内的文件。它应该是InputStream。
签名应如下所示:

@PermitAll
@POST
@Path(URL)
@Produces(MediaType.APPLICATION_JSON)
public Map<String, Object> fileHandler(
    @FormDataParam("formdata") InputStream formdata,
    @FormDataParam("formdata") FormDataContentDisposition fileDetail
){   }

在这里你还可以看到另一个参数&#34; FormDataContentDisposition&#34;,你可以从中获取有关数据的详细信息,比如文件名和大小(当你读取InputStream时会很有用)。
请注意,我为JAX-RS编写了此示例。不确定你使用的是什么库。