![](/img/trans.png)
[英]how to send MultiValueMap containing a file in a POST request to Spring rest web service?
[英]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 -> Integer
, chunkNumber-> Integer
, finalChunk -> 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.