天天看点

Struts2实现文件上传下载

文件的上传

概述:
第一步,需要输入流 读入虚拟机程序中 
第二步从虚拟机程序输出流放到需要的路径
思路:
1.客户端 浏览器如何处理---表单
2.action 中如何处理上传的文件
3.如何将文件保存到服务器的某个位置。
uil:统一资源描述符  项目名+actionname名
method 提交方式 get不安全
               post 协议体
               
    <form action=" " method="post" enctype="" >
    <input type="file" name="uplode" />
    <input type="submit" value="确认上传" />
    </form>
    详细解释说明:enctype :"application/x-wwww-form-urlencodel"--默认,服务器可以根据表单的name属性获取表单的值
    enctype="multipart/form-date"---这种形式,表单的数据会被以二进制的方式送到服务器,服务器可以等到用户上传的信息。
    
    服务器端(后台)
    UplodeAction{
    	需要接收客户端上传的内容(接收一个流)
    	如何将接收到的文件存储到服务器的某个位置
    }

           
文件上传(以上传图片为列) 版本1
1.前台 jsp 页面
 <form action="/Io/uploade1" method="post" enctype="multipart/form-data">
   		<input type="file" name="uploade1"/>
        <input type="submit" value="确认上传"/> 
 </form>

2. struts2.xml文件
 	<package name="p1" extends="struts-default" namespace="/">
        <action name="uploade1" class="com.upload.Uploade1">
            <result name="success" type="redirect">/success.jsp</result>
        </action>
    </package>
    
3.后台 Action 
package com.upload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.opensymphony.xwork2.ActionSupport;
//文件的上传 最原始版本
public class Uploade1 extends ActionSupport {
	//接收上传文件的参数 数据类型必须为 File
	private File uploade1;
	public File getUploade1() {
		return uploade1;
	}
	public void setUploade1(File uploade1) {
		this.uploade1 = uploade1;
	}
	public String execute() throws IOException{	
		//将接收到的参数 放到输入流中
		InputStream is = new FileInputStream(uploade1);
		 //利用输出流 给定目标文件上传的路径及上传后文件的名称 (绝对路径)
		OutputStream os = new FileOutputStream("D:\\apache-tomcat-7.0.88-windows-x64\\apache-tomcat-7.0.88\\webapps\\Io\\uplode1\\1.jpg");
		 //利用字节流进行向外输出
		byte[] be = new byte[1024];
		int len =0;
		while(true){
		len= is.read(be, 0, be.length);
		if(len == -1) break;
		os.write(be, 0, len);
		}
		is.close();
		os.close();
		return "success";		
	}
}
           
文件上传(以上传图片为列) 版本2
1.jsp页面:
 <form action="/Io/uploade2" method="post" enctype="multipart/form-data">
   		<input type="file" name="upload"/>
        <input type="submit" value="确认上传"/> 
   </form>
2.struts2.xml 配置文件
<struts>
	<!-- 设置上传文件的大小限制 -->
   <constant name="struts.multipart.maxSize" value="2097152000"></constant>
    <package name="p1" extends="struts-default" namespace="/">  
        <action name="uploade2" class="com.upload.Uploade2">
        <!--引入默认拦截器-->
        	<interceptor-ref name="defaultStack"></interceptor-ref>
            <result name="load">/success.jsp</result>
        </action>
    </package>
</struts>

3.后台package com.upload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class Uploade2 extends ActionSupport  {
	//接收上传文件的参数  使用struts2框架进行 文件上传 接收的参数必须是 upload
	private File upload;
	//动态获取上传文件的名称 :获取文件上传的原始名称   表单元素name属性的值+FileName
	private String uploadFileName;
	//指定目录
	private String directory;
	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	public String getDirectory() {
		return directory;
	}
	public void setDirectory(String directory) {
		this.directory = directory;
	}
	
	public String execute() throws IOException{	
		ServletContext servletContext = ServletActionContext.getServletContext();
		String realPath = servletContext.getRealPath("/directory/"+"/"+uploadFileName);
		System.out.println("相对路径="+realPath);	
		//第一个参数表示 前台  传过来原始文件,第二个参数是存储文件的相对路径
		FileUtils.copyFile(upload, new File(realPath));
		return "load";
	}
}
           

文件的下载

1.在服务器上装备好要下载的文件
1.1将文件 copy 到下载的目标
2.编写 action
           

文件下载 样例代码

1.jsp 页面:
<!--使用超链接-->
  <body>
  		<a href="/Io/DownLoadAction?name=Java_20190123110336.flv">点击下载</a>
  </body>
  
2.struts2.xml文件
<struts>
	<!-- 设置上传文件的大小限制 -->
   <constant name="struts.multipart.maxSize" value="2097152000"></constant>
    <package name="p1" extends="struts-default" namespace="/">
        <!-- 文件下载 -->
           <action name="DownLoadAction" class="com.download.DownLoadAction">
   			<result type="stream">
   			<!-- 指定下载文件的类型 默认下载为txt格式 本例为下载视频 -->
      		<param name="contentType">text/plain</param>
      		<!-- 下载图片 -->
     <!--  <param name="contentType">image/jpg</param> -->
      <!--  解释说明: 
        contentDisposition:指定下载文件在浏览器客户端窗口打开还是以附件的形式下载到本地
        inline:==》在浏览器窗口打开
        attachment==>以附件的形式下载到本地
       -->
      <param name="contentDisposition">attachment;filename=${name}</param>
      <param name="bufferSize">1024</param>
   </result>
  </action>     
    </package>
</struts>

3.Action 后台代码:

package com.download;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.swing.JSlider;
import javax.swing.plaf.basic.BasicSliderUI;
import javax.swing.plaf.basic.BasicSliderUI.ActionScroller;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class DownLoadAction extends ActionSupport {
	//接收参数 接收需要下载文件的名称
	private String name;	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public InputStream getInputStream() throws FileNotFoundException{
        //获取服务器上需下载文件的路径
		ServletContext sc = ServletActionContext.getServletContext();		
		InputStream is = new FileInputStream(sc.getRealPath("/upload"+"/"+name));
		//返回流
		return is;
	}
}

           

继续阅读