如何使用Ajax post请求将文件以块的形式发送到Java Eclipse休息服务

时间:2018-03-21 16:32:47

标签: java ajax eclipse rest

我正在我的网络应用程序中实现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)

1 个答案:

答案 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 -> IntegerchunkNumber-> IntegerfinalChunk -> 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
           }

       }

     }