十六、Struts2文件上传与下载

  1. 文件上传与下载

    1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post" enctype="multipart/form-data">

    2.动作类中字段需要符合命名规范

        表单字段名:image

        动作类:File image;

         String imageFileName; 文件名

                 String imageContentType;文件的MIME类型

    3.上传拦截器参数的配置

    文件大小、文件类型限制等

    错误消息提示:中文    

    4.多文件上传:File或者List数组

     

  2. 单文件上传

    开发步骤:

    Jsp代码:

    <br/> ----单文件上传----<br/>

    <s:form action="uploadOneAction" enctype="multipart/form-data">

            <s:textfield name="username" label="姓名"></s:textfield>

            <s:file name="photo" label="相片"></s:file>

            <s:submit value="上传"></s:submit>

    </s:form>

     

    Struts.xml文件配置代码:

    <package name="p1" extends="struts-default">

            <action name="uploadOneAction" class="com.itheima.action.UploadAction1">

                <result>/success.jsp</result>

            </action>

    </package>

     

    动作类代码:

    public class UploadAction1 extends ActionSupport {

        // 变量命名需与表单名称保持一致

        private String username;

        // 与表单字段对应,必须是java.io.File类型的

        private File photo;

        // 上传的文件名,格式:上传字段+FileName

        private String photoFileName;

        // 上传文件MIME类型,格式:上传字段名+ContentType

        private String photoContentType;

     

        public String execute() throws Exception {

            // 打印相关字段属性

            System.out.println(username);

            System.out.println(photo);

            System.out.println(photoFileName);

            System.out.println(photoContentType);

            /*

             * 上传文件步骤:

             * 1.得到上传文件的真实路径

             * 2.构建输入流

             * 3.构建输出流

             */

            // 1.得到上传文件的真实路径

    //上传字段:上传到某个文件夹。存到应用的files目录下

            String storeDir = ServletActionContext.getServletContext().getRealPath(

                    "files");

            // 把上传过来的文件,重写创建一个文件

            File file = new File(storeDir, photoFileName);

     

            /*

            // 以前复制文件的方式

             * 但是现在呢?我们不需要这么做啦,Struts2都帮我们封装了

            InputStream in = new FileInputStream(photo);

            OutputStream out = new FileOutputStream(file);

     

            int len = 0;

            byte[] bys = new byte[1024];

            while ((len = in.read(bys)) != -1) {

                out.write(bys, 0, len);

            }

            in.close();

            out.close();

            */

            FileUtils.copyFile(photo, file);

            return SUCCESS;

        }

    }

    2、多文件上传

    将文件类型定义为:List 或者File数组

    Jsp代码:

    <br>-----多文件上传-----<br>

    <form action="${pageContext.request.contextPath}/upload2.action" method="post" enctype="multipart/form-data">

        用户名:<input type="text" name="username"/><br/>

        靓照:<input type="file" name="photo"/><br/>

        靓照:<input type="file" name="photo"/><br/>

        <input type="submit" value="上传"/>

    </form>

     

    Struts.xml文件配置代码:

    <action name="upload2" class="com.itheima.actions.UploadAction2" method="upload">

    <!--             <interceptor-ref name="defaultStack"> -->

    <!--                 <param name="fileUpload.allowedTypes">image/jpeg,image/png</param> -->

    <!--                 <param name="fileUpload.allowedExtensionsSet">jpg,jpeg,png</param> -->

    <!--             </interceptor-ref> -->

                <result>/success.jsp</result>

                <result name="error">/error.jsp</result>

                <result name="input">/indexMulti.jsp</result>

            </action>

     

    动作类代码:

    //文件上传:fileUpload拦截器完成的

    public class UploadAction2 extends ActionSupport {

        

        private String username;

        private File[] photo;//和表单的上传字段名保持一致。类型是File类型的 .数组或List

        private String[] photoFileName;//上传的文件名

        private String[] photoContentType;//上传文件的MIME类型

        public String upload(){

            //上传字段:上传到某个文件夹。存到应用的images目录下

            String realPath = ServletActionContext.getServletContext().getRealPath("/images");

            File directory = new File(realPath);

            if(!directory.exists()){

                directory.mkdirs();

            }

            try {

                for(int i=0;i<photo.length;i++){

                    FileUtils.copyFile(photo[i], new File(directory, photoFileName[i]));

                }

                return SUCCESS;

            } catch (IOException e) {

                e.printStackTrace();

                return ERROR;

            }

        }

    }

     

     

     

    3、原理分析:

    a、是由一个拦截器来完成的。fileUpload

    可以通过配置拦截器的参数,指定拦截的扩展名或文件的MIME类型

    <action name="uploadOneAction" class="com.itheima.action.UploadAction1">

                <interceptor-ref name="defaultStack">

                <!--对已有的拦截器注入参数 -->

                <param name="fileUpload.allowedExtensions">txt</param>

                </interceptor-ref>

                <result>/success.jsp</result>

    </action>

     

    b、超出大小或非法文件的上传,会报错(转向一个input的视图)

     

    通过:

    <s:actionError/> <s:feildError/>显示错误消息的提示

    c、错误消息提示改为中文版:借助国际化的消息资源文件

     

    如果是通过配置全局默认参数引起的错误,最好用全局的消息资源文件。

     

     

    struts2默认的提示资源文件:struts2-core-**.jar 的org.apache.struts2的struts-message.properties文件中。比着key值覆盖对应的value即可。

    4、文件下载

    原理:是一个结果类型来处理的。stream

     

    编码步骤:

    动作类:

    public class DownloadAction extends ActionSupport {

        // 文件下载用到的输入流

        private InputStream imageFileIn;

        // 记住下载文件的文件名

        private String fileName;

     

        public String download1() throws Exception {

            // 给输入流赋值即可

            String realPath = ServletActionContext.getServletContext().getRealPath(

                    "/file/mm.jpg");

            // c:\apacher\file\4.jpg

            fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);

            // 解决中文名称乱码文件

            fileName = URLEncoder.encode(fileName, "UTF-8");

            imageFileIn = new FileInputStream(realPath);

            return SUCCESS;

        }

    }

     

    struts.xml配置文件:主要是对stream类型的结果进行配置

    <action name="download1" class="com.itheima.action.DownloadAction" method="download1">

                <result type="stream">

                    <!--动作类中InputStream的字段名 -->

                    <param name="inputName">imageFileIn</param>

                    <!-- 告知浏览器响应头:文件的MIME类型 -->

                    <param name="contentType">application/octet-stream</param>

                    <!--告诉浏览器下载的方式 -->

                    <!-- 使用OGNL表达式获取动作类中的属性 -->

                    <param name="contentDisposition">attachment;filename=${fileName}</param>

                </result>

    </action>

     

转载于:https://www.cnblogs.com/Prozhu/p/5886462.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言试题四十三之求出ss所指字符串中指定字符的个数,并返回此值。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

《Matlab实用案例》系列Matlab从入门到精通实用100例案例教程目录(持续更新)

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之《Matlab使用案例》 3. 专栏目录 【MATLAB统计分析与应用100例】案例001&#xff1a;matlab使用Importdata函数导入文本txt数据【MATLAB统计分析与应用100例】案例002&#xff…

Quartz2 定时器 《一》(概述)

为什么80%的码农都做不了架构师&#xff1f;>>> Quartz2 说白了&#xff0c;就是个功能比较完善的定时器&#xff0c;可以通过指定的时间执行指定的任务。 应用范围 a.比如让商城的活动&#xff08;对象&#xff09;在指定的时间&#xff08;定时&#xff0…

SQL 数据库远程备份 语句

DECLARE DATABakPath VARCHAR(200) N\\192.168.0.22\DataBak --远程共享目录&#xff08;备份文件夹根目录&#xff09; DECLARE UserName VARCHAR(50) N192.168.0.22\dbuser --远程目录访问用户账户 DECLARE UserPwd VARCHAR(50) N123456 --远程目录访问用户密码 DECLARE R…

九、为影院添加影片《仿淘票票系统前后端完全制作(除支付外)》

一、数据获取 首先打开在线编辑器进入我们的项目&#xff1a;https://editor.ivx.cn/ 上一节已展示了影院页&#xff0c;但是你点击影院页进入后将看不到任何数据&#xff0c;这是因为当前影院还未有添加的影片&#xff0c;本节之后将会从页面开始完成这个功能。 首先我们应…

大话领域驱动设计——基础设施层

概述基础设施层是整个系统的⽀持层&#xff0c;通过对第三⽅类库的调⽤或系统的抽象和集成来实现对其他层的⽀持。与传统架构不同在DDD中&#xff0c;数据库访问的具体实现&#xff08;仓储&#xff09;也被放在了基础设施层。在DDD的理念中&#xff0c;基础设施层是为领域和用…

C语言试题四十四之移动一维数组中的内容,若数组中由n个整数,要求把下标从0到p(p小于等于n-1)的数组元素平移到数组的最后。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

【MATLAB统计分析与应用100例】案例004:matlab调用smoothts函数对金融时间序列数据进行平滑处理

时间序列数据进行平滑处理效果预览: Excel原数据部分预览: 1. 读取金融时间序列数据,绘制波形图 x = xlsread(examp03_02.xls); % 从文件examp03_02.xls中读取数据 price = x(:,4)

javaweb优化

http://blog.csdn.net/jiangzhaobao/article/details/8003244转载于:https://www.cnblogs.com/yzjT-mac/p/5889292.html

MultiProcess-MultiThread

听到一些关于python多进程与多线的例子&#xff0c;感觉比较经典&#xff0c;把一些例子分享一下. 内容如下&#xff1a; Process、Thread、GIL、Process fork、Multiprocessing、Queue、ProcessPool、Multiprocess-Multithread comparison (1) Process : 程序的一次执行(程序编…

【MATLAB统计分析与应用100例】案例005:matlab调用medfilt1函数对加噪正弦波信号进行平滑处理

平滑效果预览: 文章目录 1. 产生加噪正弦波信号,绘制加噪波形图2. 调用medfilt1对加噪正弦波信号y进行中值滤波,并绘制波形图1. 产生加噪正弦波信号,绘制加噪波形图 t = linspace(0,2*pi,500); % 产生一个从0到2

十、为影院添加影片及座位安排《仿淘票票系统前后端完全制作(除支付外)》

一、选中添加功能完成 首先打开在线编辑器进入我们的项目&#xff1a;https://editor.ivx.cn/ 在上一节咱们已经完成了对应的准备工作&#xff0c;在这一节中&#xff0c;咱们只需要对其进行调用即可&#xff0c;调用前还需要处理这些数据&#xff1a; 首先选中时&#xff0…

遍历文件夹还原数据库SQL语句

/***** 遍历文件夹进行数据库还原 *******/---需要开启xp_cmdshell 如已经开启 可以略过 /***** Step 1 开启 xp_cmdshell Use Master GO EXEC master.dbo.sp_configure show advanced options, 1 RECONFIGURE WITH OVERRIDE GO EXEC master.dbo.sp_configure xp_cmdshell, 1…

聊聊 C# 和 C++ 中的 泛型模板 底层玩法

最近在看 C 的方法和类模板&#xff0c;我就在想 C# 中也是有这个概念的&#xff0c;不过叫法不一样&#xff0c;人家叫模板&#xff0c;我们叫泛型&#xff0c;哈哈&#xff0c;有点意思&#xff0c;这一篇我们来聊聊它们底层是怎么玩的&#xff1f;一&#xff1a;C 中的模板玩…

ceph集群报 Monitor clock skew detected 错误问题排查,解决

ceph集群报 Monitor clock skew detected 错误问题排查&#xff0c;解决 告警信息如下&#xff1a; [rootceph-100-80 ceph]# ceph -w cluster ddc1b10b-6d1a-4ef9-8a01-d561512f3c1d health HEALTH_WARN clock skew detected on mon.ceph-100-81,…

Java实现画八卦

八卦是由多个圆叠加而成&#xff0c;如果我们让每个圆都有自己的颜色&#xff0c;那么具体结构便一目了然&#xff0c;如下图所示&#xff1a; 显然只要令对应的圆颜色相同&#xff0c;就能达到我们预期的效果。 用Java就能轻松画出来&#xff1a; import java.awt.BasicStroke…

C语言试题四十五之把第1到第p个字符,平移到字符串的最后,把第p+1到最后的字符移到字符串的前部。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

【MATLAB统计分析与应用100例】案例006:matlab数据的标准化变换

文章目录 1. 调用rand函数产生一个10行,4列的随机矩阵,每列服从不同的均匀分布2. 调用zscore函数对x进行标准化变换(按列标准化),返回变换后矩阵xz,以及矩阵x各列的均值构成的向量mu,各列的标准差构成的向量sigma3. 变换结果1. 调用rand函数产生一个10行,4列的随机矩阵…

十一、为影院添加影片制作准备服务《仿淘票票系统前后端完全制作(除支付外)》

一、为影院添加影片的逻辑和思考 首先打开在线编辑器进入我们的项目&#xff1a;https://editor.ivx.cn/ 进入之后找到上一节中制作的页面&#xff0c;咱们设置点击编辑按钮后进入的页面为影院添加影片页&#xff1a; 接着咱们查看影院添加影片页&#xff1a; 在该页中&…

Linux 内核中断内幕【转】

转自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/ 本文对中断系统进行了全面的分析与探讨&#xff0c;主要包括中断控制器、中断分类、中断亲和力、中断线程化与 SMP 中的中断迁徙等。首先对中断工作原理进行了简要分析&#xff0c;接着详细探讨了中断亲…