2013-07-10 31 views
4

我有一個Windows Phone 8的客戶端,使下面的POST請求請求它自動作爲「multipart/form-data」請求。多文件上傳和JSON對象在遊戲框架一個POST請求

在玩2.1的上傳操作的控制器如下:

@BodyParser.Of(BodyParser.Json.class) 
public static Result createMessage() { 
    JsonNode json = request().body().asJson(); 
    ObjectNode result = Json.newObject(); 
    String userId = json.findPath("userId").getTextValue(); 
    String rayz = json.findPath("message").getTextValue(); 

    Http.MultipartFormData body = request().body().asMultipartFormData(); 
    Http.MultipartFormData.FilePart picture = body.getFile("picture"); 

    if (picture != null) { 
     String fileName = picture.getFilename(); 
     String contentType = picture.getContentType(); 
     File file = picture.getFile(); 

     result.put("status", "success"); 
     result.put("message", "Created message!"); 
     return badRequest(result); 
    } else { 
     result.put("status", "error"); 
     result.put("message", "Message cannot be created!"); 
     return badRequest(result); 
    } 
} 

注意,在application.conf我已成立,以增加大小限制(似乎不工作)以下內容:現在

# Application settings 
# ~~~~~ 
parsers.text.maxLength=102400K 

,每次我試圖使POST請求我注意到對IsMaxSizeEsceeded變量調試時間總是真實的多變量爲空。當我試圖使用下面的控制器上傳一個文件nu時,一切似乎都正常工作。大小不是問題,並設置了多部分變量。

public static Result singleUpload() { 
    ObjectNode result = Json.newObject(); 

    Http.MultipartFormData body = request().body().asMultipartFormData(); 
    Http.MultipartFormData.FilePart picture = body.getFile("picture"); 
    if (picture != null) { 
     String fileName = picture.getFilename(); 
     String contentType = picture.getContentType(); 
     File file = picture.getFile(); 
     result.put("status", "success"); 
     result.put("message", "File uploaded!"); 
     return badRequest(result); 
    } else { 
     result.put("status", "error"); 
     result.put("message", "File cannot be uploaded!"); 
     return badRequest(result); 
    } 
} 

的問題是,附件/文件應該被髮送/與JSON對象到服務器沿着在單個POST請求上傳和未單獨。

有沒有人遇到過類似的問題?是否有可能實現這一點 - 發送一個json對象和多個文件上傳到服務器在一個POST請求與Play 2.1?

回答

8

找到辦法做到這一點.. ..如果有人試圖在未來做類似的事情。

所以首先從RestSharp客戶的所有要求必須按以下方式進行的:

public async Task<string> DoPostRequestWithAttachmentsAsync(String ext, JSonWriter jsonObject, ObservableCollection<byte[]> attachments) { 
    var client = new RestClient(DefaultUri); 
    var request = new RestRequest(ext, Method.POST); 

    request.RequestFormat = DataFormat.Json; 
    request.AddParameter("json", jsonObject.ToString(), ParameterType.GetOrPost); 

    // add files to upload 
    foreach (var a in attachments) 
     request.AddFile("attachment", a, "someFileName"); 

    var content = await client.GetResponseAsync(request); 

    if (content.StatusCode != HttpStatusCode.OK) 
      return <error>; 

    return content.Content; 
} 

現在移動到播放控制器如下:

public static Result createMessage() { 
    List<Http.MultipartFormData.FilePart> attachments; 
    String json_str; 

    Http.MultipartFormData body = request().body().asMultipartFormData(); 

    // If the body is multipart get the json object asMultipartFormData() 
    if (body!=null) { 
     json_str = request().body().asMultipartFormData().asFormUrlEncoded().get("json")[0]; 
     attachments= body.getFiles(); 
    } 
    // Else, if the body is not multipart get the json object asFormUrlEncoded() 
    else { 
     json_str = request().body().asFormUrlEncoded().get("json")[0]; 
     attachments = Collections.emptyList(); 
    } 

    // Parse the Json Object 
    JsonNode json = Json.parse(json_str); 

    // Iterate through the uploaded files and save them to the server 
    for (Http.MultipartFormData.FilePart o : attachments) 
     FileManager.SaveAttachmentToServer(o.getContentType(), o.getFile()); 

    return ok(); 
} 

所以在失誤RestSharp方面似乎是json對象上的ParameterType.RequestBody;並在控制器中的大小並沒有真正改變任何東西..但重要的是不使用@ BodyParser.Of(BodyParser.Json.class),因爲它會將整個請求體轉換成json對象。這與正在發送到服務器的文件結合觸發isMaxSizeExceeded標誌。

最後,控制器中的多部分文件處理如上所示,唯一棘手的部分是附件是可選的,這意味着必須處理。

相關問題