繁体   English   中英

如何使用Ajax发布请求将大块文件发送到Java Eclipse Rest服务

[英]How to send file in chunks using Ajax post request to Java Eclipse rest service

我正在我的Web应用程序中实现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 rest服务方法修饰。

 @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)

您的javascript ajax网址有一些错误

查看serviceUrl http://localhost:8080/JerseyDemos/rest/upload/pdf/docId/finalChunk/FileName ,您的Java Rest Service(RS)参数和javascript url的预期类型不匹配

  • docId在您的URL中是一个字符串,但是在您的Java RS中,它被标记为Integer并被称为docSetId

  • 你的java RS IST期待某些类型: docId -> IntegerchunkNumber-> IntegerfinalChunk -> Boolean 但是,您仅发送字符串作为url(docId / finalChunk / FileName)。

Java RS映射器找不到您的rest服务方法来订购您的请求。 只需修复您的URL即可。 作为示例,请尝试:

serviceUrl = "http://localhost:8080/JerseyDemos/rest/upload/pdf/203/4/myFileName"

编辑

如果参数正确,请检查浏览器是否确实将数据块发送到服务器。 它可以发送您的其他(文本)参数(docId,chunkNumber和finalchunk),但无法发送二进制数据。 您可以使用Firebug(如果您正在使用Mozilla进行测试)进行检查,以了解如何操作 监视您发送的每个上载,以查看它们是否确实离开了浏览器。 检查您的请求,看看是否还有数据块,以及它的名字。

如果它没有离开您的浏览器,或者没有离开但结构不正确,则问题出在客户端(您的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
           }

       }

     }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM