簡體   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