2017-09-06 69 views
0

我想通过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中获取信息,这些方法都没有给出任何结果。

回答

0

管理使用下面的外部库,以获得零件:

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); 
     } 
    } 

requestresponse是相关到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; 
    } 
} 
0

你有服务器端上传请求

通常是您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()
+0

不幸的是,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

+0

检入浏览器DevTools发送到服务器的内容类型。因为你提交了几个输入类型和其中一个'file' - 你必须有'content-type:multipart/...'。那么servlet应该将它解析为多部分。 – daggett

+0

'Request Headers' content-type:multipart/form-data'对应于Chrome Dev-Tools的网络日志。 – DreadLockDave