Struts文件上傳與下載

1.單文件上傳

1.1 文件上傳表單

<!-- 文件上傳必須加enctype="multipart/form-data" --> 
<!-- 文件上傳必須method="post" -->
<form action="/Struts05/uploadDemo" method="post" enctype="multipart/form-data">
	<!-- file的name屬性值對應Action類的File upload --> 
	<input type="file" name="upload"/><br/>
	<input type="submit" value="上傳"/>
</form>

1.2 struts.xml

<struts>	
    <constant name="struts.devMode" value="true"></constant>
    
    <!-- 整個項目上傳文件允許的最大文件大小,單位:B  -->
    <!-- 全局常量,超出限制不會進入action -->
    <constant name="struts.multipart.maxSize" value="2097152000"></constant>
       
	<package name="default" extends="struts-default" namespace="/">
		<action name="*Demo" class="com.action.DemoAction" method="{1}">		                   
			<result name="success" >/upload_success.jsp</result>
			
			<!-- 文件大小丶文件格式校驗不通過等上傳失敗會跳到input結果頁 -->
			<!-- input結果頁可以通過actionerror標籤和fielderror獲取文件上傳錯誤信息  -->
			<result name="input" >/upload_fail.jsp</result>
			
			<!-- 爲當次上傳請求fileUpload攔截器設置參數 -->
            <interceptor-ref name="fileUpload">   
                <!--當次上傳文件允許的最大文件大小,單位:B -->     
	            <param name="maximumSize ">209715200</param> 
	            <!-- 當次上傳文件允許上傳文件的MIME類型 -->   
	            <param name="allowedTypes">image/png,image/gif,image/jpeg</param> 
	        </interceptor-ref>  
	          
	        <!-- 一旦顯式調用了攔截器,就不會自動調用默認攔截器,爲了不影響功能,這裏必須顯式調用默認攔截器 -->
	        <interceptor-ref name="defaultStack"></interceptor-ref>            
		</action>
	</package>		
</struts>

1.3 處理文件上傳的Action

package com.action;

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

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DemoAction extends ActionSupport {
	private String uploadFileName;   //文件名,包括擴展名,字段名格式:【file的name值+FileName】  
    private String uploadContentType;  //文件類型,字段名格式:【file的name值+ContentTyp】
    private File upload;     //文件對象,字段名對應表單的file的name屬性
    
    
	public String upload(){
		
		try {
			//獲取服務器端存放上傳文件目錄的物理路徑			
			String path=ServletActionContext.getServletContext().getRealPath("/upload");
			
			//Eclipse和MyEclipse獲取的路徑不一樣,根據實際path值查看上傳成功的文件
			//System.out.println(path);
			
			//創建服務器端存儲的文件
			//實際應用中文件名可以使用各種方式避免重名(GUID丶當前時間毫秒值丶隨機數等)
			File destFile=new File(path,uploadFileName);
			
			//使用commons-fileupload把上傳的文件複製到服務器端的目錄下(struts自帶,如果沒有導入jar包)
			FileUtils.copyFile(upload, destFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return SUCCESS;
	}
	
		
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}	
}

2. 多文件上傳

2.1 多文件上傳表單

<!-- 文件上傳必須加enctype="multipart/form-data" --> 
	<!-- 文件上傳必須method="post" -->
	<form action="/Struts05/uploadDemo2" method="post" enctype="multipart/form-data">
		<!-- 多個同name值的file表單標籤 --> 
		<input type="file" name="upload"/><br/>
		<input type="file" name="upload"/><br/>
		<input type="file" name="upload"/><br/>
		<input type="submit" value="上傳"/>
	</form>

2.2 struts.xml

  • 參考1.2

2.3 處理多文件上傳的Action

package com.action;

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

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class Demo2Action extends ActionSupport {
	//多文件上傳字段屬性都變成了數組(也可以用集合)
	private String[] uploadFileName;   //文件名數組,包括擴展名,字段名格式:【file的name值+FileName】  
    private String[] uploadContentType;  //文件類型數組,字段名格式:【file的name值+ContentTyp】
    private File[] upload;     //文件對象數組,字段名對應表單的file的name屬性
	
	
	public String upload(){
		try {
			//獲取服務器端存放上傳文件目錄的物理路徑			
			String path=ServletActionContext.getServletContext().getRealPath("/upload");
												
			for (int i=0;i<upload.length;i++) {
				//對非空文件進行操作
				if(upload[i]!=null){
					//創建服務器端存儲的文件					
					File destFile=new File(path,uploadFileName[i]);
					//複製文件到服務器路徑
					FileUtils.copyFile(upload[i], destFile);
				}
			}
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		return SUCCESS;
	}

	public String[] getUploadFileName() {
		return uploadFileName;
	}

	public void setUploadFileName(String[] uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	public String[] getUploadContentType() {
		return uploadContentType;
	}

	public void setUploadContentType(String[] uploadContentType) {
		this.uploadContentType = uploadContentType;
	}

	public File[] getUpload() {
		return upload;
	}

	public void setUpload(File[] upload) {
		this.upload = upload;
	}
}

3. 文件下載

3.1 下載頁面

<a href="/Struts05/downloadDemo3?downloadFile=圖片101.png">點擊下載</a>

3.2 struts.xml配置

<action name="*Demo3" class="com.action.Demo3Action" method="{1}">
			   
          <!-- 結果類型設置爲stream -->    
          <result name="success" type="stream">            
              <!-- 文件MIME類型,一般設置爲application/octet-stream即可 -->     
              <param name="contentType">application/octet-stream</param>     
              <!-- 輸入流名稱,inputStream對應Action的getInputStream()方法 -->     
              <param name="inputName">inputStream</param>     
              <!-- 設置響應的HTTP表頭信息 -->     
              <!-- attachment提示用戶保存或打開文件,filename表示下載時顯示的文件名 -->  
              <!-- 文件名對應Action的getFileName()方法 -->   
              <param name="contentDisposition">attachment;filename="${fileName}"</param> 
              <!-- 下載文件名是中文時轉碼防止中文亂碼 -->
              <param name="encode">true</param> 
                  
              <!-- 設置文件下載的緩衝區的大小,單位是K -->     
              <param name="bufferSize">4096</param>               
          </result>                                		
	</action>

3.3 處理文件下載的Action

public class Demo3Action extends ActionSupport {
	private String downloadFile;  //請求參數:請求下載的文件名
	private InputStream inputStream;  //文件輸入流,對應struts.xml的inputName參數值
	 //下載文件時彈框顯示的文件名稱(如果要顯示中文需要struts.xml配置encode爲ture)	
	private String fileName;     
	

	public String download() {
		try {
			//獲取下載文件目錄的物理路徑
			String path = ServletActionContext.getServletContext().getRealPath("/upload");
			
			//因爲請求參數查詢字符串有中文,所以這裏需要轉碼一下(配置了中文轉碼攔截器這裏就不需要轉碼)
			downloadFile=new String(downloadFile.getBytes("ISO-8859-1"), "UTF-8");
			
			//構建下載文件的對象
			File file = new File(path, downloadFile);

			//創建下載文件的輸入流
			FileInputStream fis = new FileInputStream(file);
			
			//把下載文件的輸入流裝進緩衝流中(增加性能)
			inputStream=new BufferedInputStream(fis);
			
			//設置下載文件彈窗顯示的文件名稱
			fileName="此文件下載由Struts05網站提供---"+downloadFile;
			
		} catch (IOException e) {

			e.printStackTrace();
		}

		return SUCCESS;
	}

	public String getDownloadFile() {
		return downloadFile;
	}

	public void setDownloadFile(String downloadFile) {
		this.downloadFile = downloadFile;
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public InputStream getInputStream() {
		return inputStream;
	}

	public void setInputStream(InputStream inputStream) {
		this.inputStream = inputStream;
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章