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

}

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