2012-03-22 49 views
3

我想使用單個Struts 2文件標籤上傳多個文件。在Struts 2中使用單個文件標籤上傳多個文件

與Gmail一樣,我們使用CTRL鍵附加多個文件以選擇多個文件。

我知道如何上傳多個文件,但我想使用單個文件標籤。

+0

S2本身不使用單標籤不提供這樣的功能,但你可以使用jQuery或其他東西爲 – 2012-03-22 06:22:21

+0

參考這個問題http://stackoverflow.com/questions/8322499/struts2-file-upload – 2012-03-22 06:24:52

+0

嘿@UmeshAwasthi ..可以請你幫助一下上面例子的struts 2映射嗎? – 2012-03-26 10:12:59

回答

1

我在小畫廊應用程序中上傳多個文件。如果你的行動已經被設置爲接收多個文件,那麼它很簡單,只要(警告:這個工程除了IE瀏覽器幾乎所有主要的瀏覽器,所以你需要爲這個基於jQuery的或閃存解決方案):

<s:form namespace="/gallery" action="image-upload" method="POST" enctype="multipart/form-data"> 
    <s:file name="image" multiple="multiple"/> 
    <s:submit/> 
</s:form> 

您可能已經查看過設置最大文件大小的參數(對於單個文件),默認情況下這是2MB,如果我沒有記錯,並且最大總文件大小有不同的值(即所有文件彙總在一起)。如果用戶能夠上傳圖片增加這個後來值收集好是非常有用的,這個值設置爲大約20 MB(在struts.xml中):

<constant name="struts.multipart.maxSize" value="20000000" /> 

編輯:對於感興趣的,在html從上面呈現的是...

<form id="image-upload" name="image-upload" action="/PhotoGallery/gallery/image-upload.action" method="POST" enctype="multipart/form-data"> 
    <input type="file" name="image" value="" id="image-upload_image" multiple="multiple"/> 
    <input type="submit" id="image-upload_0" value="Submit"/> 
</form> 

UPDATE 2014月(近2年後): 多重屬性現在被Internet Explorer 10,火狐,歌劇,鉻,和Safari支持。

它不受Internet Explorer 9和更早版本的支持。

+0

我從來沒有見過'multiple'作爲文件參數。可以將我鏈接到它提到的doc,因爲它真的是一件有趣的事情 – 2012-03-22 07:41:13

+0

從來沒有看到文件標記的多個屬性 – 2012-03-22 08:48:07

+0

+1。 @UmeshAwasthi:[如這裏所述](http://stackoverflow.com/questions/16393581/need-to-upload-multiple-files-at-once/17212916#17212916),Struts的''元素允許動態屬性,這個意味着您可以放入任何現有(或不)屬性,並且它將在JSP中呈現,而不受Struts檢查。 – 2013-06-20 11:54:08

1

以下示例程序演示如何實現使用Struts2框架上載多個文件的功能。該應用程序顯示一個上傳表單,允許用戶選取三個文件一次上傳。 上傳的文件被複制到應用程序的struts.xml文件中配置的位置。

讓我們看看示例應用程序是如何編碼的。 上傳的形式在upload.jsp頁面實現如下:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="s" uri="/struts-tags" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Multiple Files Upload with Struts2</title> 
</head> 
<body> 
    <center> 
     <h2>Pick multiple files to upload</h2> 
     <s:form action="uploadFile" enctype="multipart/form-data" method="post"> 
      <s:file name="fileUpload" multiple="multiple" label="Pick files" size="30"/> 
      <br/> 
      <s:submit value="Upload All" /> 
     </s:form> 
    </center> 
</body> 
</html> 

實施MultipleFilesUploadAction.java文件的Struts2的動作類,如下所示:

import java.io.File; 
import java.io.IOException; 

import org.apache.commons.io.FileUtils; 

public class MultipleFilesUploadAction { 
    private File[] fileUpload; 
    private String[] fileUploadFileName; 
    private String[] fileUploadContentType; 

    /** 
    * This is the path to save uploaded file, which is configured in struts.xml 
    */ 
    private String saveDirectory; 

    public String doUpload() { 

     // copy the uploaded files into pre-configured location 
     for (int i = 0; i < fileUpload.length; i++) { 
      File uploadedFile = fileUpload[i]; 
      String fileName = fileUploadFileName[i]; 
      File destFile = new File(saveDirectory + File.separator + fileName); 
      try { 
       FileUtils.copyFile(uploadedFile, destFile); 
      } catch (IOException ex) { 
       System.out.println("Could not copy file " + fileName); 
       ex.printStackTrace(); 
      } 
     } 

     return "success"; 
    } 

    public File[] getFileUpload() { 
     return fileUpload; 
    } 

    public void setFileUpload(File[] fileUploads) { 
     this.fileUpload = fileUploads; 
    } 

    public String[] getFileUploadFileName() { 
     return fileUploadFileName; 
    } 

    public void setFileUploadFileName(String[] fileUploadFileNames) { 
     this.fileUploadFileName = fileUploadFileNames; 
    } 

    public String[] getFileUploadContentType() { 
     return fileUploadContentType; 
    } 

    public void setFileUploadContentType(String[] fileUploadContentTypes) { 
     this.fileUploadContentType = fileUploadContentTypes; 
    } 

    public String getSaveDirectory() { 
     return saveDirectory; 
    } 

    public void setSaveDirectory(String saveDir) { 
     this.saveDirectory = saveDir; 
    } 
} 

在這個POJO類行動,我們使用三個陣列來存儲上傳的文件:

private File[] fileUpload; 
private String[] fileUploadFileName; 
private String[] fileUploadContentType; 
  • 請注意,單詞「fileUpload」與upload.jsp文件中<s:file>標記的名稱 屬性的值匹配。 Struts2的 攔截器調用fileUpload將通過設置器爲這些變量 獲取數據。
  • 變量saveDirectory的值通過相應的 setter由Struts2的staticParams攔截器設置,並且該值可以是在struts.xml文件中配置的 。
  • 動作類的輸入方法doUpload()拷貝上傳的文件 從臨時目錄由 saveDirectory變量指定的位置,然後重定向到一個‘成功’視圖,其是 結果頁。

結果頁面result.jsp的 - 是非常簡單的,它顯示了一個成功的消息:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Upload result</title> 
</head> 
<body> 
    <center> 
     <h2>The files were uploaded successfully</h2> 
    </center> 
</body> 
</html> 

我們通過應用程序的支柱連接上傳表單頁面,動作類和結果頁面.XML文件如下:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 
    <constant name="struts.multipart.maxSize" value="20971520" /> <!-- 20MB --> 

    <package name="fileUpload" extends="struts-default"> 

     <action name="uploadFile" class="com.example.struts.MultipleFilesUploadAction" 
      method="doUpload"> 

      <param name="saveDirectory">E:/Test/Upload</param> 

      <interceptor-ref name="fileUpload"> 
       <param name="allowedTypes">*/*</param> 
       <param name="maximumSize">4194304</param> <!-- 4MB --> 
      </interceptor-ref> 

      <interceptor-ref name="staticParams"/> 
      <interceptor-ref name="params" /> 
      <interceptor-ref name="validation" /> 
      <interceptor-ref name="workflow" /> 

      <result name="success" type="redirect">/result.jsp</result> 
      <result name="input">/upload.jsp</result> 
     </action> 
    </package> 

</struts> 
  • 這裏,INT受感染者fileUpload被配置爲允許所有文件 類型可以上傳,並且單個文件的最大大小爲 4MB。
  • 常量struts.multipart.maxSize限制允許多個請求的最大大小爲 爲20MB。這意味着上傳 文件的總大小不能超過20MB。
+0

基本上與官方指南相同 - https://cwiki.apache.org/confluence/display/WW /文件+上傳#的FileUpload-UploadingMultipleFiles。 – 2015-07-22 12:34:18