2013-08-27 16 views
1

我有一個由常規文本輸入和文件上傳組成的表單。如何在liferay動作中訪問multipart/form-data表單參數

<portlet:actionURL var='create' name="addProduct"> 
</portlet:actionURL>  
<form id="addform" action="<%=create%>" method="post" enctype="multipart/form-data"> 

    <dl class="dl-horizontal"> 
     <dt>Product Name</dt> 
     <dd> 
      <input type="text" name="name" /> 
     </dd> 
     <dt>Image File</dt> 
     <dd> 
      <input type="file" name="imgFile" > 
     </dd> 
    </dl> 
     <button type="submit">Save</button> 
</form> 

在portlet中類我想訪問上傳的文件和參數「name」。我發現當我把enctype =「multipart/form-data」放在我的表單中時,我無法得到 request.getParameter(「name」)ParamUtil.getString(這裏是「name」參數)請求,「名稱」)

但是當我刪除enctype =「multipart/form-data」時,我可以看到「name」參數,但是當然上傳的文件會丟失。我怎麼能同時擁有上傳的文件和常規參數

編輯: 我的動作實現的是:

@ProcessAction(name = "addProduct") 
public void addProduct(ActionRequest request, ActionResponse response) { 
     String name = ParamUtil.getString(request,"name"); 
      String anotherTryForName = request.getParameter("name"); 
     System.out.println(name); 
      System.out.println(anotherTryForName); 
     System.out.println(uploadImg(request)); 
} 
private String uploadImg(ActionRequest request) { 

     String realPath = getPortletContext().getRealPath("/"); 
     byte[] bytes = null; 
     try { 

      UploadPortletRequest uploadRequest = PortalUtil 
        .getUploadPortletRequest(request); 
      String sourceFileName = uploadRequest.getFileName("imgFile"); 
      File file = uploadRequest.getFile("imgFile"); 
      try { 
       bytes = FileUtil.getBytes(file); 
      } catch (IOException e2) { 
       e2.printStackTrace(); 
      } 
      File newFile = null; 

      if ((bytes != null) && (bytes.length > 0)) { 

       try { 
        newFile = new File(realPath + "demo/productimg/" 
          + sourceFileName); 
        FileInputStream fileInputStream = new FileInputStream(file); 
        FileOutputStream fileOutputStream = new FileOutputStream(
          newFile); 
        fileInputStream.read(bytes); 
        fileOutputStream.write(bytes, 0, bytes.length); 
        fileOutputStream.close(); 
        fileInputStream.close(); 
       } catch (FileNotFoundException e) { 
        System.out.println("File Not Found."); 
        e.printStackTrace(); 
       } catch (IOException e1) { 
        System.out.println("Error Reading The File."); 
        e1.printStackTrace(); 
       } 
      } 
      return sourceFileName; 
     } catch (Exception e) { 
      System.out.println("Exception::::" + e.getMessage()); 
      return ""; 
     } 
} 
+0

有大量的點擊搜索對谷歌* Liferay的上傳*,甚至包含代碼樣本。 –

+0

我不在尋找liferay文件上傳示例。我的文件上傳工作正常。我的問題是當我使用多部分窗體時,我無法訪問我的常規參數。我搜查了一下,發現什麼都沒有 – Hekmatof

+0

啊我明白了,對不起。我給我的猜測作爲答案然後... –

回答

3

發現,當表單是多部分/表單數據,我應該從UploadPortletRequest代替的ActionRequest獲得額外的參數(如「名」)。獲取參數的

正確的形式:

UploadPortletRequest uploadRequest = PortalUtil 
        .getUploadPortletRequest(request); 
String name = ParamUtil.getString(uploadRequest,"name"); 
+0

它仍然不適合我。 –

+0

也不適合我。看來我們不得不使用另一個框架來代替liferay-mvcportlet – amir

1

當你張貼到Portlet操作,參數應該被命名空間的門戶。嘗試

<input type="text" name="<portlet:namespace/>name"/> 
... 
<input type="file" name="<portlet:namespace/>imgFile"/> 

或者,您可以使用aui taglib,例如,

<aui:form ...> 
    <aui:input ... name="name"/> 
</aui:form> 

這個標籤庫自動添加命名空間

+0

沒有什麼改變 – Hekmatof

+0

好的,那麼我們需要看看你使用的行動實施。你可以將你的動作處理器的相關部分添加到你的問題中嗎? –

+0

我編輯問題添加行動實施 – Hekmatof