通过 ajax 和 groovy 形成数据
formdata via ajax with groovy
我正在尝试通过 ajax 将图像文件和相应信息传输到 groovlet 服务器。
问题:
我无法从 HTTPServletRequest 对象中获取数据。
这是我用来传输数据的 Javascript-代码:
$("#submitButton").click( function(){
if ( submitButtonCondition == true ) {
//Gathering Data
var enabledValue = false;
if ($("#activate").val()){
enabledValue = true;
}
var metadata = $("#metaTextarea").val();
var inputFile = $("#fileInput")[0].files[0];
// Creating FormData-Object filled with necessary Data
var formData = new FormData();
formData.append('file', inputFile);
formData.append('enabled', enabledValue);
formData.append('metadata', metadata);
// Sending FormData to Server
$.ajax({
type : 'POST',
url : '/createNewEntry.groovy',
contentType: false,
processData: false,
data: formData,
success: function(resultData){
console.log("Upload successful");
},
failure: function(resultData){
console.log("Upload failed");
}
});
}
});
验证数据是否已发送的唯一方法是访问请求对象的附加 reader:System.out.println(request.reader.text);
输出如下所示:
------WebKitFormBoundaryzNUfRksUAVW2ioCa
Content-Disposition: form-data; name="file"; filename="blatest.png"
Content-Type: image/png
------WebKitFormBoundaryzNUfRksUAVW2ioCa
Content-Disposition: form-data; name="enabled"
true
------WebKitFormBoundaryzNUfRksUAVW2ioCa
Content-Disposition: form-data; name="metadata"
asdfasdfasdf
------WebKitFormBoundaryzNUfRksUAVW2ioCa--
这么明显数据已经转移了?
尽管如此,我仍在努力从方法 getParameter, getParameterMap, getParameterNames, getParameterValues
中获取信息,这些方法都没有输出。
您收到服务器端多部分请求
通常你的request
应该是instanceof
http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html
你可以使用以下方法:
Part getPart(java.lang.String name)
获取具有给定名称的零件。
java.util.Collection<Part> getParts()
设法使用以下外部库获取部件:
org.apache.commons.fileupload
org.apache.commons.io
代码看起来像这样:
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Figure out ServerContext
ServletContext servletContext = context;
// Configure a repository (to ensure a secure temp location is used)
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
// Set factory constraints
factory.setSizeThreshold(50000);
factory.setRepository(repository);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
// Process the uploaded items
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next()
if (item.isFormField()) {
processFormField(item);
} else {
processUploadedFile(item, servletContext);
}
}
request
和 response
与 groovlet 对象相关。
方法processFormField()
和ProcessUploadedFile()
可以访问表单数据和缓存文件。
例如,processFormField()
通过以下方式访问信息:
private void processFormField(FileItem item) {
String name = item.getFieldName()
String value = item.getString()
if (name=="enabled") {
queryEnabledValue=value;
}
if (name=="metadata") {
queryMetadata=value;
}
}
我正在尝试通过 ajax 将图像文件和相应信息传输到 groovlet 服务器。
问题: 我无法从 HTTPServletRequest 对象中获取数据。
这是我用来传输数据的 Javascript-代码:
$("#submitButton").click( function(){
if ( submitButtonCondition == true ) {
//Gathering Data
var enabledValue = false;
if ($("#activate").val()){
enabledValue = true;
}
var metadata = $("#metaTextarea").val();
var inputFile = $("#fileInput")[0].files[0];
// Creating FormData-Object filled with necessary Data
var formData = new FormData();
formData.append('file', inputFile);
formData.append('enabled', enabledValue);
formData.append('metadata', metadata);
// Sending FormData to Server
$.ajax({
type : 'POST',
url : '/createNewEntry.groovy',
contentType: false,
processData: false,
data: formData,
success: function(resultData){
console.log("Upload successful");
},
failure: function(resultData){
console.log("Upload failed");
}
});
}
});
验证数据是否已发送的唯一方法是访问请求对象的附加 reader:System.out.println(request.reader.text);
输出如下所示:
------WebKitFormBoundaryzNUfRksUAVW2ioCa
Content-Disposition: form-data; name="file"; filename="blatest.png"
Content-Type: image/png
------WebKitFormBoundaryzNUfRksUAVW2ioCa
Content-Disposition: form-data; name="enabled"
true
------WebKitFormBoundaryzNUfRksUAVW2ioCa
Content-Disposition: form-data; name="metadata"
asdfasdfasdf
------WebKitFormBoundaryzNUfRksUAVW2ioCa--
这么明显数据已经转移了?
尽管如此,我仍在努力从方法 getParameter, getParameterMap, getParameterNames, getParameterValues
中获取信息,这些方法都没有输出。
您收到服务器端多部分请求
通常你的request
应该是instanceof
http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html
你可以使用以下方法:
Part getPart(java.lang.String name)
获取具有给定名称的零件。java.util.Collection<Part> getParts()
设法使用以下外部库获取部件:
org.apache.commons.fileupload
org.apache.commons.io
代码看起来像这样:
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Figure out ServerContext
ServletContext servletContext = context;
// Configure a repository (to ensure a secure temp location is used)
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
// Set factory constraints
factory.setSizeThreshold(50000);
factory.setRepository(repository);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
// Process the uploaded items
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next()
if (item.isFormField()) {
processFormField(item);
} else {
processUploadedFile(item, servletContext);
}
}
request
和 response
与 groovlet 对象相关。
方法processFormField()
和ProcessUploadedFile()
可以访问表单数据和缓存文件。
processFormField()
通过以下方式访问信息:
private void processFormField(FileItem item) {
String name = item.getFieldName()
String value = item.getString()
if (name=="enabled") {
queryEnabledValue=value;
}
if (name=="metadata") {
queryMetadata=value;
}
}