我有一个 Windows Phone 8 客户端,它发出以下发布请求:
public async Task<string> DoPostRequestAsync(String URI, JSonWriter jsonObject, ObservableCollection<byte[]> attachments)
{
var client = new RestClient(DefaultUri);
var request = new RestRequest(URI, Method.POST);
request.AddParameter("application/json; charset=utf-8", jsonObject.ToString(), ParameterType.RequestBody);
// add files to upload
foreach (var a in attachments)
request.AddFile("picture", a, "file.jpg");
var content = await client.GetResponseAsync(request);
return content;
}
从 RestSharp 文档中,我了解到通过将文件添加到请求中,它会自动作为“multipart/form-data”请求进行。
Play 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 变量始终为 true 并且 multipart 变量为空。当我尝试使用以下控制器上传一个文件时,一切似乎都正常工作。大小不是问题,并且设置了多部分变量。
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);
}
}
问题是附件/文件应该在单个 POST 请求中与 JSON 对象一起发送/上传到服务器,而不是单独发送。
有没有人遇到过类似的问题?是否有可能实现这一点 - 使用 Play 2.1 在单个 POST 请求中发送一个 json 对象和多个要上传到服务器的文件?