struts2实现文件上传与下载

一、单文件上传

1、文件上传条件:
(1)请求方法必须是post
(2)enctype的属性值必须为multipart/form-data
(3)提供一个文件选择域
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>上传</title>
</head>
<body>
    <s:actionerror/>
    <s:form action="upload.action" enctype="multipart/form-data">
        <s:textfield name="userName" label="用户名"/>
        <s:file name="photo" label="照片"/>
        <s:submit value="上传"/>
    </s:form>
</body>
</html>

3、文件上传编写动作类注意:
(1)struts2提供的上传文件名命名规则:上传的字段名(form表单中的)+fileName
(2)struts2提供MIME类型命名规则:上传的字段名(form表单中的)+contentType
(3)没有使用模型驱动时:form表单提供的属性和struts2提供的属性要生成set和get方法
4、上传文件动作类代码

package com.san.action;
import java.io.File;
import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Upload extends ActionSupport{
    private static final long serialVersionUID = 1L;
    //表单提供的属性
    private String userName;
    private File photo;
    //struts2在文件上传时提供的属性
    private String photoFileName;//上传的文件名(上传的字段名+fileName)
    private String photoContentType;//上传文件的MIME类型(上传的字段名+contentType)
    public String upload(){
        //1、拿到servletContext
        ServletContext application=ServletActionContext.getServletContext();
        //String filePath=application.getRealPath("/WEB-INF/files");
        //2、调用realPath方法,获取一个虚拟目录而得到一个真实的目录
        String filePath=application.getRealPath("/WEB-INF/files");
        File file=new File(filePath);
        //3、如果真实目录不存在则创建
        if(!file.exists()){
            file.mkdirs();
        }
        //4、把photo存过去
        photo.renameTo(new File(file,photoFileName));
        return null;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public File getPhoto() {
        return photo;
    }
    public void setPhoto(File photo) {
        this.photo = photo;
    }
    public String getPhotoFileName() {
        return photoFileName;
    }
    public void setPhotoFileName(String photoFileName) {
        this.photoFileName = photoFileName;
    }
    public String getPhotoContentType() {
        return photoContentType;
    }
    public void setPhotoContentType(String photoContentType) {
        this.photoContentType = photoContentType;
    }
}

5、编写struts.xml配置文件注意:
(1)上传文件默认为2兆,修改上传限制时,value的值应该是算出来的,不能写成这种形式1024*1024*5(修改为5兆)
(2)限制文件的扩展名时,如果有多个限制条件用逗号隔开
(3)限制文件的MIME时,如果有多个条件时用逗号隔开;jpg形式的图片写成jpeg不能写成jpg
6、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.ognl.allowStaticMethodAccess" value="true"></constant>
    <!-- 设置开发者模式 -->
    <constant name="struts.devMode" value="true"></constant>
    <!-- 限制文件上传的大小 (默认为2兆)-->
    <constant name="struts.multipart.maxSize" value="5242880"></constant>
    <!-- 配置全局消息资源包,解决英文问题 -->
    <constant name="struts.custom.i18n.resources" value="fileupload_message"></constant>
    <package name="p1" extends="struts-default">

        <!-- 上传1 -->
        <action name="upload" class="com.san.action.Upload" method="upload">
            <!-- 限制文件的扩展名,如果有多个限制条件用逗号隔开
            <interceptor-ref name="defaultStack">
                <param name="fileUpload.allowedExtensions">jpg</param>
            </interceptor-ref>
             -->
             <!-- 限制文件的MIME,如果有多个文件时使用逗号隔开 -->
             <interceptor-ref name="defaultStack">
                <param name="fileUpload.allowedTypes">image/jpeg</param>
             </interceptor-ref>
            <result name="input">upload.jsp</result>
        </action>
    </package>
</struts>

7、将不符合条件的上传的英文提示改为中文提示
(1)创建一个properties文件

struts.messages.error.content.type.not.allowed=\u8F93\u5165\u6B63\u786E\u7684\u5404\u5F0F\: {0} "{1}" "{2}" {3}

(2)struts.xml中,配置全局资源包

<!--value为properties文件的名字-->
<constant name="struts.custom.i18n.resources" value="fileupload_message"></constant>

(3)效果如下:
这里写图片描述
这里写图片描述

二、多文件上传

1、只需要修改动作类中代码,其他的不变;代码如下

private String userName;
    private File[] photo;
    //struts2提供的两个属性
    private String[] photoFileName;//文件名(表单字段属性+fileName)
    private String[] photoContentType;//文件MIME属性
    public String upload2(){
        ServletContext application=ServletActionContext.getServletContext();
        //获取路径
        String filePath=application.getRealPath("/WEB-INF/files2");
        //判断路径是否存在
        File file=new File(filePath);
        if(!file.exists()){
            //路径不存在时,创建
            file.mkdirs();
        }
        //遍历把文件剪切到创建的文件中
        for(int i=0;i<photo.length;i++){
            photo[i].renameTo(new File(file,photoFileName[i]));
        }
        return null;
    }

三、文件下载

1、文件下载的struts.xml配置代码

<package name="p2" extends="struts-default">
        <action name="download" class="com.san.action.Download" method="download">
            <!--stream类型:直接向页面输出二进制数据 -->
            <result name="success" type="stream">
                <!-- 给stream结果视图注入参数:Content-Type -->
                <param name="contentType">application/octet-stream</param>
                <!-- 告知浏览器一什么方式打开 ${@java.net.URLEncoder@encode(filename,"UTF-8")}-->
                <param name="contentDisposition">attachment;filename=1.jpg</param>
                <!-- 注入字节流,取值要写动作类中的set方法名称,首字母改成小写 -->
                <param name="inputName">inputStream</param>
            </result>
        </action>
    </package>

2、文件下载的动作类代码

package com.san.action;

import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Download extends ActionSupport{
    private static final long serialVersionUID = 1L;
    //指定InputStream的名称时,不能使用in
    private InputStream inputStream;
    //创建一个文件名属性
    private String filename;
    public String download() throws Exception{
        //1、找到文件存储位置
        String filePath=ServletActionContext.getServletContext().getRealPath("/WEB-INF/files/1.jpg");
        //2、把文件读入到InputStream流中
        inputStream=new FileInputStream(filePath);
        //3、给文件名赋值
        filename="照片.jpg";
        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;
    }
}
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

shaonianbz

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值