我正在我的网络应用程序中实现PDF文件上传功能,我试图在javascript中读取文件并使用file.slice(start,stop)将其分成块,阅读本文后我试图在Ajax中发送它请求使用循环直到所有块发送到服务,如下所示
self.ajaxCallToUploadFile = function (docId, finalChunk, fileName, data) {
var formData = new FormData();
formData.append('file', data);
var serviceUrl = "http://localhost:8080/JerseyDemos/rest/upload/pdf/docId/finalChunk/FileName";
return $.ajax({
url: serviceUrl,
type: 'POST',
success: function (rdata) {
alert(rdata.d);
},
error: function (errorData) {
alert(errorData.responseText);
},
data: formData,
cache: false,
contentType: 'multipart/form-data',
//contentType: false,
processData: false,
async: false
});
};
使用文件块作为数据我在服务URL中的查询字符串中发送其他参数。 我是Java和Java服务的新手,我正在使用Eclipse来编写服务。我试图将此文件块读取为Inputstream但它失败了。我试图在这个问题上搜索具体的答案,但我到处都得到了如何将文件从java代码发送到java服务的答案。在这里,我希望能够回答如何将它从javascript发送到Java rest服务以及如何在Java rest服务中读取它。
请帮助我,因为我正在努力实现此功能 下面是我试过的Java休息服务方法装饰。
@Path("/upload")
public class JerseyService {
@POST
@Path("/pdf/{docId}/{chunkNumber}/{finalChunk}")
@Consumes({ MediaType.MULTIPART_FORM_DATA})
public Response uploadPdfFile(@PathParam("docSetId") final Integer docId,
@PathParam("chunkNumber") final Integer chunkNumber, @PathParam("finalChunk") final Boolean finalChunk,
@FormDataParam("file") FormDataBodyPart file)
答案 0 :(得分:0)
你的javascript ajax url中有一些错误
查看serviceUrl http://localhost:8080/JerseyDemos/rest/upload/pdf/docId/finalChunk/FileName
,您的java Rest Service(RS)参数和javascript url的预期类型中存在不匹配:
docId
是您网址中的字符串,但在您的Java RS中,它被标记为Integer
,其名称为docSetId
。
您的java RS期待某些类型:docId -> Integer
,chunkNumber-> Integer
,finalChunk -> Boolean
。但是你只发送字符串作为url(docId / finalChunk / FileName)。
java RS映射器无法找到您的其余服务方法来订购您的请求。 只需修复您的网址即可例如试试:
serviceUrl = "http://localhost:8080/JerseyDemos/rest/upload/pdf/203/4/myFileName"
修改强>:
如果您的参数正常,请检查您的浏览器确实发送您的 数据块到服务器。它可以发送您的其他(文本)参数(docId,chunkNumber和finalchunk),但无法发送二进制数据。您可以使用firebug检查(如果您使用mozilla进行测试)see how to。监控您发送的每个上传内容,看看他们是否离开您的浏览器。检查您的请求,看看数据块是否也会离开,以及它带有哪个名称。
如果它没有离开你的浏览器,或者离开但形成不好,则问题出在客户端(你的javascript片段和附加代码在这里有问题)。
如果它离开浏览器,则尝试使用InputStream
处理块,如下所示:
@Path("/upload")
public class JerseyService {
@POST
@Path("/pdf/{docId}/{chunkNumber}/{finalChunk}")
@Consumes({ MediaType.MULTIPART_FORM_DATA})
public Response uploadPdfFile(@PathParam("docSetId") final Integer docId,
@PathParam("chunkNumber") final Integer chunkNumber,
@PathParam("finalChunk") final Boolean finalChunk,
@FormDataParam("file") InputStream file){
// do something with file like
int nextByte = -1;
while((nextByte = file.read()) != -1){
// process your byte here
}
}
}