2014-09-04 105 views
1

我正在使用RESTEasy通過鍵和值來放置某些數據。我只想接受小於4k的數據,我想通過獲取請求的內容長度來檢查數據。下面是我的工作方法:MultipartFormDataInput請求的內容長度始終爲-1

@PUT 
@Path("/{key}") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response addData(
    final @PathParam("key") String dataKey, 
    MultipartFormDataInput data) throws IOException, ClassNotFoundException { 

    final HttpServletRequest request = ....getHttpRequest(); //returns the request 

    final Map<String, List<InputPart>> parts = data.getFormDataMap(); 
    final List<InputPart> inputParts = parts.get("data"); 
    final InputPart part= inputParts.get(0);  
    final InputStream dataStream = part.getBody(InputStream.class, null); 

    int length = request.getContentLength(); 
    String length2 = request.getHeader("Content-Length"); 
    System.out.println(length); 
    System.out.println(length2); 

    service.addData(key, dataStream); 

    return Response.status(204).build(); 
} 

然而,lengthlength2分別-1null回報。如果我監視Fiddler並查看請求,我注意到請求中的contentLength不是-1,而是它相當正確的值。

關於爲什麼我無法獲取請求內容長度的任何想法?謝謝。

編輯:我的PUT請求看起來像這樣使用高級REST客戶端Chrome擴展:http://i.imgur.com/aI6WNDy.png

編輯:不知道我還有很多其他因素增加,但在這個任何想法將是巨大的。

+0

無法重現你的問題。你可以嘗試使用RESTeasy客戶端進行測試:'WebTarget target = ClientBuilder.newClient().target(「yourUrl」); MultipartFormDataOutput formData = new MultipartFormDataOutput(); formData.addFormData(「data」,「Hello World」,MediaType.TEXT_PLAIN_TYPE);實體實體= Entity.entity(formData,MediaType.MULTIPART_FORM_DATA);響應響應= target.request()。put(實體);' – lefloh 2014-09-06 20:57:13

+0

當我獲得時間時,我會給出一個鏡頭。感謝您的迴應。 – joshft91 2014-09-08 16:46:01

+0

我無法用RESTeasy客戶端構建它。我覺得奇怪的是,在Fiddler中,我得到了內容長度,但在請求期間我無法查看它。 – joshft91 2014-09-24 15:57:32

回答

0
+0

感謝您的建議,但結果是我懷疑的。我添加了這行'final @HeaderParam(「Content-Length」)字符串contentLength',但結果相同:'null'。我真的不明白在調試方法時如何獲得'null' /'-1',但在Fiddler中查看時是否正確。它可能與輸入數據是輸入流並且不知道輸入數據的長度,因此返回null/-1有關嗎?我只是在這裏大聲說話。 – joshft91 2014-09-24 17:06:19

+0

您需要整個有效負載的長度或特定數據元素的長度 – 2014-09-24 17:52:11