2017-09-06 57 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