我正在通过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类中的这个文件。我究竟做错了什么?也许有人知道更好的解决方案。
答案 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编写了此示例。不确定你使用的是什么库。