我在AngularJS 1.5和服务器端有一个使用sparkjava 2.5的客户端 我有一个post方法来发送一个包含json和附件的表单 当我尝试在服务器端阅读它时,我就是不能。我尝试了在互联网上搜索过的所有内容,并且无法找到一种方法来阅读它。 发生了什么:
在客户端,我尝试了这种方法:
this.createNew = function(file) {
var file = $scope.newDurability.file
var fd = new FormData();
fd.append('file', file);
fd.append('data', angular.toJson($scope.newDurability));
$http.post(postURL, fd, {
headers: {
'Content-Type': undefined
},
transformRequest: angular.identity,
params: {
fd
}
});
在sparkjava中,我尝试使用他们在网页中提供的代码来阅读multipart / form-data:
post("/durability", "multipart/form-data", (req, res) -> {
req.raw().setAttribute("org.eclipse.jetty.multipartConfig",
new MultipartConfigElement("/tmp"));
Collection<Part> parts = req.raw().getParts();
...
但是部件始终是空的。
此外,当我阅读请求的正文(String body = req.body();
)时,我明白了:
------WebKitFormBoundaryrMxfw31B1kgNNhNz
Content-Disposition: form-data; name="file"; filename="Toggl_time_entries_2016-09-01_to_2016-09-30.pdf"
Content-Type: application/pdf
...file binary data...
------WebKitFormBoundaryhHoLHo9P2qmbSNYK
Content-Disposition: form-data; name="data"
{"equipment":"gloves","material":[{"text":"latex"}],"days":1}
------WebKitFormBoundaryhHoLHo9P2qmbSNYK--
执行以下操作时,所有内容都为空或为空:
Set<String> attributes = req.attributes();
QueryParamsMap queryMap = req.queryMap();
Set<String> queryParams = req.queryParams();
Map<String, String> params = req.params();
当我尝试通过将密钥(对我尝试的密钥并不重要)传递给这些函数来获取数据时也是如此。例如:
String params2 = req.params("data");
String parameter = req.raw().getParameter("data");
所以问题是: 我究竟做错了什么?我猜客户端是正确的,因为请求发送显然是正确的,所以我的假设是有一些技巧与sparkjava使它工作。或者,有一种技巧可以发送表单数据,使sparkjava能够正确地解释表单,并且我将能够读取这些部分。