zoukankan      html  css  js  c++  java
  • Struts2 文件上传和下载

    实现原理

    Struts 2是通过Commons FileUpload文件上传。

    Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件

    具体实现

    1.单文件的上传(大文件的上传、上传文件的类型):

    JSP页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ 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=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <s:fielderror></s:fielderror><!-- 接收拦截器返回的错误信息 -->
    <form action="File_insert" method="post" enctype="multipart/form-data">
        <input type="file" name="haha" />
        <input type="submit" name="提交" />
    </form>
    </body>
    </html>

    struts.xml文件

    <!-- struts2默认的上传文件大小是2M,超出时就要配置下面的这句话:大文件上传 -->
        <constant name="struts.multipart.maxSize" value="20000000"></constant>  
         
        <!-- file文件上传,文件上传是基于拦截器实现的 -->
        <package name="File" namespace="/file" extends="struts-default">
            <action name="*_*" class="com.maya.file.{1}Action" method="{2}">
                <result>{1}_{2}.jsp</result>
                <result name="input">File_add.jsp</result><!-- 当上传的文件不符合要求是,其struts底层返回的是input -->
                
                <!-- 定义一个拦截器,来规定文件上传的规格 -->
                <interceptor-ref name="fileUpload">
                    <param name="allowedTypes">image/bmp,image/x-png,image/gif,image/jpg,image/jpeg</param><!-- 定义文件上传的类型  -->
                    <param name="maximumSize">81101</param><!-- 定义文件上传的大小  -->
                </interceptor-ref>
                
                <interceptor-ref name="defaultStack"></interceptor-ref><!-- 再一次调用默认的拦截器栈 -->
            </action>
        </package>

    ActionSupport类

    package com.maya.file;
    
    import java.io.File;
    import java.io.IOException;
    
    import org.apache.commons.io.FileUtils;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class FileAction extends ActionSupport {
        private File haha; //文件java.util.File包
        private String hahaFileName; //文件名==文件+FileName
        private String hahaContentType; //获取文件类型,文件+ContentType    
        public File getHaha() {
            return haha;
        }
        public void setHaha(File haha) {
            this.haha = haha;
        }
        public String getHahaFileName() {
            return hahaFileName;
        }
        public void setHahaFileName(String hahaFileName) {
            this.hahaFileName = hahaFileName;
        }
        public String getHahaContentType() {
            return hahaContentType;
        }
        public void setHahaContentType(String hahaContentType) {
            this.hahaContentType = hahaContentType;
        }
    
        public String insert() throws IOException{
            System.out.println("文件名:"+hahaFileName);
            System.out.println("文件类型:"+hahaContentType);
            String filePath="C:/Users/Dell-Pc/Desktop/概念车/"+hahaFileName;//设置文件下载位置
            File saveFile=new File(filePath);//定义文件
            FileUtils.copyFile(haha, saveFile);//将haha复制
            return SUCCESS;
        }
        
    }

    2.多文件的上传(其实多文件的上传,无非就把单文件上传的那套东西都变成了数组而已)

    JSP页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ 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=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <s:fielderror></s:fielderror><!-- 接收拦截器返回的错误信息 -->
    <form action="Files_insert" method="post" enctype="multipart/form-data">
        文件1:<input type="file" name="haha"/><br/>
        文件2:<input type="file" name="haha"/><br/>
        文件3:<input type="file" name="haha"/><br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    </html>

    struts.xml文件(同上一样)

    ActionSupport类

    package com.maya.files;
    
    import java.io.File;
    import java.io.IOException;
    
    import org.apache.commons.io.FileUtils;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class FilesAction extends ActionSupport {
        private File[] haha; //文件java.util.File包
        private String[] hahaFileName; //文件名==文件+FileName
        private String[] hahaContentType; //获取文件类型,文件+ContentType    
        public File[] getHaha() {
            return haha;
        }
        public void setHaha(File[] haha) {
            this.haha = haha;
        }
        public String[] getHahaFileName() {
            return hahaFileName;
        }
        public void setHahaFileName(String[] hahaFileName) {
            this.hahaFileName = hahaFileName;
        }
        public String[] getHahaContentType() {
            return hahaContentType;
        }
        public void setHahaContentType(String[] hahaContentType) {
            this.hahaContentType = hahaContentType;
        }
        public String insert() throws IOException{
            for(int i=0;i<haha.length;i++){
                System.out.println("文件名:"+hahaFileName[i]);
                System.out.println("文件类型:"+hahaContentType[i]);
                String filePath="C:/Users/Dell-Pc/Desktop/概念车/"+hahaFileName[i];//设置文件下载位置
                File saveFile=new File(filePath);//定义文件
                FileUtils.copyFile(haha[i], saveFile);//将haha复制
            }        
            return SUCCESS;
        }   
    }

    3.文件的下载(返回的是文件流)

    JSP页面

    struts.xml

    <!-- 文件下载 -->
            <action name="download" class="com.maya.files.DownAction">
                <result type="stream"><!-- 返回一个流 -->            <!-- 文件名-->
                    <param name="contentDisposition">attachment;filename=${fileName}</param>
                </result>
            </action>

    ActionSupport类

    package com.maya.files;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class DownAction extends ActionSupport {
        private String fileName;//下载文件的名字
    
        public String getFileName() throws Exception{
            fileName=new String(fileName.getBytes(),"ISO8859-1");//以为获得的字符集是ISO8859-1,所以要转码
            return fileName;
        }
    
        public void setFileName(String fileName) {
            this.fileName = fileName;
        }
        
        public InputStream getInputStream()throws Exception{//需要实现这个方法
            File file=new File("C:/Users/Dell-Pc/Desktop/概念车/哈哈.jpg");
            this.fileName="allan";
            return new FileInputStream(file);//返回一个文件流
        }
        
    }
  • 相关阅读:
    07 总结ProgressDialog 异步任务
    1. vim 的安装及配置
    debian 源设置 ( apt-get 不能安装)
    在Debian中安装VNC Server
    让BB-Black通过usb0上网
    常用的一些 linux 指令
    Linux下同一目录内文件和目录为什么不能同名?
    beaglebone black 与电脑互传文件(夹)
    永久修改 putty字体大小
    Beaglebone Black的引脚分配
  • 原文地址:https://www.cnblogs.com/AnswerTheQuestion/p/6583084.html
Copyright © 2011-2022 走看看