Struts学习笔记: 实现文件上传下载

上传

1. form表单设置提交编码

<form ... enctype="Multipart/form-data"></form>
enctype属性有三个值:
Application/x-www-form-urlencode(key-value)默认传输方式
Multipart/form-data(mine编码)以二进制流方式处理
Text/plain(纯文本编码)

<s:file name=“myUpload" label="选择上传的文件"/>

2. Action中创建3个属性与文件域对应:

private File myUpload; //上传文件属性 名称与与页面对应
private String myUploadFileName; //上传文件对应的文件名
private String myUploadContentType;//上传文件的文件类型
private String savePath; //保存到服务器存放上传文件的路径 在对应的set方法中设置绝对路径

public String getSavePath() throws Exception 
{  //返回上传文件的保存位置
    String  str = ServletActionContext.getServletContext().getRealPath(savePath);
    return str;
}

3.实现上传方法: 文件上传的action方法

方法1:使用uuid设置唯一标识的路径地址,文件输出流传输
public String upload() throws Exception {
        String strNewFileName = UUID.randomUUID().toString();
        String suffix = myUploadFileName.substring(myUploadFileName.lastIndexOf("."));
        strNewFileName+=suffix;
        //以服务器的文件保存地址和原文件名建立上传文件输出流
        FileOutputStream fos = new FileOutputStream(getSavePath()
            + "\\" + strNewFileName);
        myUploadFileName = strNewFileName;
        FileInputStream fis = new FileInputStream(getMyUpload());
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = fis.read(buffer)) > 0)
        {
            fos.write(buffer , 0 , len);
        }
        fos.close();
        return SUCCESS;
}
方法2:使用時間設置唯一的路径地址`(new Date().getTime();)`,使用`FileUtils.copyFile(File myUpload,File target)`;方法传输(org.apache.commons.io.FileUtils)
public String upload() throws Exception {
        //创建新的文件名,避免上传同名的文件而覆盖
        //new Date().getTime() 得到系统当前时间距1970/1/1的毫秒数
        String newFileName = new Date().getTime()+this.getMyUploadFileName();

        //以上传的路径和新的文件名创建目标文件对象
        File target = new File(savePath,newFileName);

        //将用户上传的临时文件复制到目标文件中
        FileUtils.copyFile(myUpload, target);

        return SUCCESS;
}

4.Struts拦截器配置

  Struts2自带的拦截器(fileUpload):限制上传的文件类型、限制上传的文件大小 
<struts>
    <!-- 全局过滤上传文件的最大值 -->
     <constant name="struts.multipart.maxSize" value="500000000"></constant>
    <!-- 指定文件上传错误消息对应的资源文件 -->
    <constant name="struts.custom.i18n.resources”  value="ApplicationResources"></constant>

    <package name="myPackage" extends="struts-default" namespace="/">
        <action name="upload" class="dps.action.FileAction" method="upload">
           <param name="savePath">/uploadFiles</param>
           <result name="success">/uploadSucc.jsp</result>
        <!– 出错后默认返回到input元素对应的页面 提示错误信息 -->
        <result name="input">/index.jsp</result>

        <interceptor-ref name="fileUpload">
            <!-- 上传文件的类型(后缀名) -->
            <param name="allowedExtensions">.jpg,.gif</param>
            <!-- 上传文件的大小(单位:字节) -->
            <param name="maximumSize">102400</param>
            </interceptor-ref>
            <!– 引用系统默认的拦截器 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
</struts>

5.设置上传过滤的错误信息为中文,需要在项目的src目录下创建ApplicationResources.properties文件,并对不同的错误信息进行配置

struts.messages.error.uploading struts.messages.error.file.too.large
struts.messages.error.file.extension.not.allowed

6.配置多个文件上传

private List myFile;//上传文件属性 private List
myFileFileName;//上传文件对应的文件名 private List
myFileContentType;//上传文件的文件类型

public String execute()throws Exception{
    //得到服务器上存放上传文件的路径
    String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
    //循环遍历文件名集合
    for (int i = 0; i < this.myFileFileName.size(); i++) {
    //得到当前的文件名并构建新的文件名
    String fileName = this.myFileFileName.get(i);
    String newFileName = new Date().getTime()+fileName;
    //以上传的路径和新的文件名创建目标文件对象
    File target = new File(realPath,newFileName);
    //将上传的临时文件复制到目标文件中
    FileUtils.copyFile(this.myFile.get(i), target);
        }
        return "success";
}

文件的下载:服务器端的文件 下载到 客户端

1.设置action类

public class FileDownloadAction extends ActionSupport {
private String downloadPath;//需要下载的文件的路径,与struts.xml中的配置对应
public String getDownloadPath() {
    return downloadPath;
}
public void setDownloadPath(String downloadPath) {
    this.downloadPath = downloadPath;
}
//InputStream的get方法,用于读取下载路径中的文件,并以InputStream流的形式返回
public InputStream getInputStream() throws Exception{
    return ServletActionContext.getServletContext().getResourceAsStream(downloadPath);
}
public String execute()throws Exception{
    return super.execute(); //调用父类的方法
}
}

2.配置struts文件

<action name="download" class="**">
<!-- 指定action中的属性downloadPath的值,即下载文件的路径 -->
<param name="downloadPath">/java.rar</param>
<!-- success结果为stream(流)的类型 -->
<result name="success" type="stream">
<!-- 设置下载的文件的类型 -->
<param name="contentType">application/rar</param>
<!--默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法, 比如这里就是 getInputStream() 来获取下载文件的内容,意味着你的 Action 要有这个方法,默认为inputStream -->
<param name="inputName">inputStream</param>
<!-- 设置下载提示框中提示的下载的文件名 ,该提示框默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件-->
<param name="contentDisposition">attachment;filename="java.rar"</param>
<!-- 指定下载的缓冲区的大小 -->
<param name="bufferSize">2048</param>
</result>
</action>

3.下载中文问题处理

public class FileDownloadAction extends ActionSupport {
private String fileName;
public String getFileName() {
try {
    ServletActionContext.getResponse().setHeader("charset", "ISO8859-1");
    return new String(this.fileName.getBytes(), "ISO8859-1");
} catch (Exception e) {
    return "获取文件名出现了错误!";
}
}

// InputStream的get方法,用于读取下载路径中的文件,并以InputStream流的形式返回
public InputStream getInputStream() throws Exception {
this.fileName="java编程基础.rar";  //读取文件时指定下载的文件名
        return  ServletActionContext.getServletContext().getResourceAsStream("/"+this.fileName);
}

public String execute() throws Exception {
    return super.execute();// 调用父类的方法
}
}

struts配置

<action name="download" class="**">
<!-- success结果为stream(流)的类型 -->
<result name="success" type="stream">
<!-- 设置下载的文件的类型 -->
<param name="contentType">application/rar</param>
<!-- 设置下载提示框中提示的下载的文件名为action中的fileName的属性值,自动调用属性的get方法-->
<param name="contentDisposition">filename="${fileName}"</param> 
<!-- 指定缓冲区的大小 -->
<param name="bufferSize">2048</param>
</result>
</action>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值