我正在使用ajax和rest web服务将文件上传到服务器。我已经捕获了文件上传事件,并在我的jquery方法中获取了文件对象。我必须将文件对象发送到Web服务,以便我可以将文件保存到db。 这是我的jquery代码..
$scope.selectFile = function (fileObj) {
if(fileObj!=undefined){
$.ajax({
url : "/RestServices/services/uploadFile",
type : "POST",
data : fileObj,
processData: false,
contentType: false,
success : function(result) {
$scope.$apply();
},
error : function(xhr, tStatus, err) {
// alert(err);
}
});
}
我也尝试过使用FormData,但我无法在Web服务中获取该文件。
var formData = new FormData();
formData.append("fileToUpload", fileObj);
if(fileObj!=undefined){
$.ajax({
url : "/RestServices/services/uploadFile",
type : "POST",
data : formData,
processData: false,
contentType: false,
success : function(result) {
$scope.$apply();
},
error : function(xhr, tStatus, err) {
// alert(err);
}
});
这是我的服务中的java代码
@POST
@Path("/uploadFile")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void uploadFile(File formData) {
try {
System.out.println(formData.getFileName());
} catch (Exception e) {
LOGGER.error("Exception in Upload File Endpoint"+ e.getMessage());
}
}
如果我直接发送文件对象而不使用formData,我得到"不支持媒体类型错误"如果我发送formData到服务,我只收到临时文件。 ajax和服务方法中应该有什么数据类型?如何在服务中获取上传的文件?任何帮助将不胜感激。
答案 0 :(得分:1)
我今天踩到了这个问题,我就这样解决了:
<强> HTML 强>
<input type="button" value="Upload document" class="btn btn-xs btn-primary uploadDocumentOnboarding">
<input id="file" type="file" class="findDocumentOnboarding">
<强>的Ajax / Jquery的强>
$(".uploadDocumentGeneral").on("click", function (evt) {
var documentData = new FormData();
documentData.append('file', $('input#file.findDocumentOnboarding')[0].files[0]);
$.ajax({
url: url,
type: 'POST',
data: documentData,
cache: false,
contentType: false,
processData: false,
success: function (response) {
alert("Document uploaded successfully.");
}
});
return false;
});
<强> JAVA 强>
@POST
@Path("upload/{id}")
@Consumes({"application/x-www-form-urlencoded", "multipart/form-data"})
public void addBlob(@PathParam("id") Integer id, @FormDataParam("file") InputStream uploadedInputStream) throws IOException {
E24ClientTemp entityToMerge = find(id);
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int read = 0;
byte[] bytes = new byte[1024];
while ((read = uploadedInputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
entityToMerge.setTestBlob(out.toByteArray());
super.edit(entityToMerge);
}
catch (IOException e) {
e.printStackTrace();
}
}
我知道有点晚了,但我看到这个问题还没有答案。
答案 1 :(得分:0)
上传文件的方法与ajax请求完全不同。此外,很难考虑所有旧浏览器。幸运的是,其他人已经为我们解决了这个问题。
我建议使用jQuery插件,例如jQuery File Upload,或使用Dropzone,这非常棒。
答案 2 :(得分:0)
我以这种方式工作:
//JAVASCRIPT
var objFile = $jQuery("#fileToUpload");
var file = objFile[0].files[0];
API.call({
url : "rest-url/upload",
type : "POST",
contentType : "multipart/form-data",
data: file,
processData: false
});
//JAVA
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@Path("rest-url/upload")
public Response upload(InputStream fileInputStream) throws Exception {
//here you got your file
return Response.ok().entity(new Object("response")).build();
}