Struts2文件上传和下载

Posted ~★半支烟☆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2文件上传和下载相关的知识,希望对你有一定的参考价值。

struts2文件上传和下载

1.创建一个index.jsp界面 和success.jsp上传成功界面

index.jsp

复制代码
<%@ taglib prefix="s" uri="/struts-tags" %>  
  <body>
  
    <s:form action="files/add"  method="post" enctype="multipart/form-data">
        <s:file label="图片上传" name="upload"/>
         <s:submit value="提交"/>
    </s:form>
复制代码

success.jsp

  <body>
    文件操作成功!!
  </body>

2.创建对应的struts.xml文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--设置文件上传的大小  -->
<constant name="struts.multipart.maxSize" value="5000000000"></constant>
<constant name="struts.devMode" value="true"/>
 <package name="default" namespace="/files" extends="struts-default">
 
 
  <action name="add" class="cn.bdqn.action.UploadAction" method="upload">
  <!-- 限制文件只能是图片
  <interceptor-ref name="fileUpload">
    <param name="allowedTypes">image/jpeg</param>
  </interceptor-ref>
  <interceptor-ref name="defaultStack"></interceptor-ref> -->
    <result>/success.jsp</result>
    <result  name="input">/index.jsp</result>
  </action>
 </package>
</struts>
复制代码

3.创建对应的UploadAction

属性名的规范  底层代码 FileUploadInterceptor中

复制代码
 File[] files = multiWrapper.getFiles(inputName);
                    if (files != null && files.length > 0) {
                        List<File> acceptedFiles = new ArrayList<File>(files.length);
                        List<String> acceptedContentTypes = new ArrayList<String>(files.length);
                        List<String> acceptedFileNames = new ArrayList<String>(files.length);
                        String contentTypeName = inputName + "ContentType";
                        String fileNameName = inputName + "FileName";
复制代码

 

复制代码
public class UploadAction extends ActionSupport {
   private  File upload;   //上传的文件  和前台file标签中的name属性 一致
   private  String uploadFileName;   //上传的文件名称   底层有规定,必须按照规范来
   private  String uploadContentType;   //上传的文件的类型
   
    
      //文件上传的方法
    public  String  upload(){
        System.out.println("进入了文件的上传......");
        //指定文件上传的路径
        String  path=ServletActionContext.getServletContext().getRealPath("/upload");
        //File.separatorChar  系统分隔符  区别linux和windows系统
        String pathName=path+File.separatorChar+uploadFileName;
        System.out.println("上传文件的全名称:"+pathName);
        try {
            FileUtils.copyFile(upload, new File(pathName));
        } catch (IOException e) {
            e.printStackTrace();
            return INPUT;
        }
        
        return  SUCCESS;
    }


    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 getUploadContentType() {
        return uploadContentType;
    }


    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }
    
    
}
复制代码

 4.多文件上传 创建index2.jsp

复制代码
<%@ taglib prefix="s" uri="/struts-tags" %>  
  <body>
  
    <s:form action="files/adds"  method="post" enctype="multipart/form-data">
        <s:file label="图片上传" name="upload"/>
        <s:file label="图片上传" name="upload"/>
        <s:file label="图片上传" name="upload"/>
         <s:submit value="提交"/>
    </s:form>
  
  </body>
复制代码

5.在struts.xml文件中 新增

 <!-- 多个文件上传 -->
  <action name="adds" class="cn.bdqn.action.UploadAction2" method="upload">
    <result>/success.jsp</result>
    <result  name="input">/index2.jsp</result>
  </action>

6.创建对应的UploadAction2

复制代码
public class UploadAction2 extends ActionSupport {
   private  File [] upload;   //上传的文件
   private  String [] uploadFileName;   //上传的文件名称
   private  String [] uploadContentType;   //上传的文件的类型
   
      //文件上传的方法
    public  String  upload(){
        System.out.println("进入了多文件的上传......");
         String path= ServletActionContext.getServletContext().getRealPath("/upload");
         String pathName="";
          //遍历 用户选择的文件
         for (int i = 0; i < upload.length; i++) {
             pathName= path+File.separatorChar+uploadFileName[i];
             try {
                 //把用户选择的文件复制到 指定的文件下
                FileUtils.copyFile(upload[i], new  File(pathName));
            } catch (IOException e) {
                e.printStackTrace();
                return  INPUT;
            }
        }
         
        return  SUCCESS;
    }


    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[] getUploadContentType() {
        return uploadContentType;
    }


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


}
复制代码

 7.创建一个downLoad.jsp

复制代码
<%@ taglib prefix="s" uri="/struts-tags" %>  
  <body>
  
    <s:form action="files/downLoad"  method="post">
       <s:textfield label="下载的地址" name="downLoad"/>
         <s:submit value="下载"/>
    </s:form>
  
  </body>
复制代码

8.在struts.xml文件中新增

复制代码
 <!-- 文件下载 -->
  <action name="downLoad" class="cn.bdqn.action.DownLoadAction" method="downLoad">
     <!-- result节点中 不需要返回界面    可以设置属性 -->
    <result type="stream">
    <!-- 文件下载到本地下载文件夹中   不写 默认 在界面中显示   源码得知 -->
      <param name="contentDisposition">attachment;filename=${fileName}</param>
    </result>
  </action>
复制代码
复制代码
public class StreamResult extends StrutsResultSupport {

    private static final long serialVersionUID = -1468409635999059850L;

    protected static final Logger LOG = LoggerFactory.getLogger(StreamResult.class);

    public static final String DEFAULT_PARAM = "inputName";

    protected String contentType = "text/plain";
    protected String contentLength;
    protected String contentDisposition = "inline";
    protected String contentCharSet ;
    protected String inputName = "inputStream";
复制代码

9.创建对应的DownLoadAction

复制代码
public class DownLoadAction extends ActionSupport {
   private   InputStream inputStream;  //创建输入流对象
    private  String  fileName;   //下载文件的名称
    private  String  downLoad;  //和前台用户输入的name属性值 一致
    
    
    
    //文件下载
    public  String   downLoad(){
        try {
            inputStream=new FileInputStream(downLoad);
            // e:\\java\\cat.jpg   只需要文件名 
            int index=downLoad.lastIndexOf("\\\\");
            fileName=downLoad.substring(index+1);
            //防止下载的中文乱码
            try {
                fileName=URLEncoder.encode(fileName, "utf-8");
            } catch (UnsupportedEncodingException e) {
                System.out.println("乱码问题");
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return  INPUT;
        }
        
        
        return SUCCESS;
    }
    
   
    
    public InputStream getInputStream() {
        return inputStream;
    }
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public String getDownLoad() {
        return downLoad;
    }
    public void setDownLoad(String downLoad) {
        this.downLoad = downLoad;
    }

}

以上是关于Struts2文件上传和下载的主要内容,如果未能解决你的问题,请参考以下文章

文件上传(多文件上传)/下载

struts2学习(14)struts2文件上传和下载多个文件上传和下载

struts2实现文件上传下载

struts2学习(13)struts2文件上传和下载

Struts2入门——Struts2的文件上传和下载

struts2文件上传下载