formdata通过ajax与groovy
问题描述:
我想通过ajax传输图像文件和相应的信息到groovlet服务器。formdata通过ajax与groovy
问题: 我无法从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");
}
});
}
});
验证数据是否已经被发送的唯一方法已访问请求对象的附属读者: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
中获取信息,这些方法都没有给出任何结果。
答
管理使用下面的外部库,以获得零件:
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
是相关到g roovlet对象。
方法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;
}
}
答
你有服务器端上传请求
通常是您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()
不幸的是,getPart的方法并没有正常工作。 (request.getPart(“file”));' 'System.out.println(request.getPart(“enabled”));' 'System.out.println(request。 getPart( “元数据”));'' 的System.out.println(request.getParts()大小());' 输出: 'null' 'null' 'null' '0' – DreadLockDave
检入浏览器DevTools发送到服务器的内容类型。因为你提交了几个输入类型和其中一个'file' - 你必须有'content-type:multipart/...'。那么servlet应该将它解析为多部分。 – daggett
'Request Headers' content-type:multipart/form-data'对应于Chrome Dev-Tools的网络日志。 – DreadLockDave