Struts文件上传与下载

一、 配置文件运行的过程

这里写图片描述

二、文件上传加强
1、当上传文件大小超过界限时,会报 no result input异常
    通过在struts.xml文件中配置常量可以设置上传文件大小
 * struts.multipart.maxSize=2097152 默认上传文件总大小 2MB 
 * 超过文件总大小,跳转input 视图, 通过 <s:actionError /> 回显错误信息 
2、在struts.xml 设置上传总大小
<constant name="struts.multipart.maxSize" value="20000000"></constant>
设置上传文件总大小,对所有上传form有效,只想对当前form进行设置,可以设置fileUpload拦截器属性 
FileUpload 拦截器有 3 个属性可以设置.
    * maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB
    * allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔  image/jpeg,text/html
    * allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔
如果针对fileUpload 进行参数设置,当出错时,在页面通过 <s:fieldError /> 回显错误信息 

3、配置input结果视图,用于处理提示上传文件大小,超限时的提示信息。
    因为在内部有个拦截器workflow,当出现错误时,会返回input结果视图
4、在进入input结果视图后,提示相应的错误信息。
    fileUpload拦截器在上传文件时,如果出现错误,会记录错误信息
    页面中引入struts2标签
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <s:actionError />  显示action乱码信息
    <s:fieldError />   显示上传错误信息
5、错误信息国际化
    国际化,一个软件根据本地语言环境的设置,可以表现出不同的语言界面。
    错误信息,框架本身就是采用国家化实现的
    配置国际化资源文件
    struts.messages.upload.error.SizeLimitExceededException=
    struts.messages.error.content.type.not.allowed=
    struts.messages.error.file.too.large=三个属性
    加载资源配置文件文件
    <!-- 加载国际化配置文件 -->
    <constant name="struts.custom.i18n.resources" value="uploadError" />   value写的是文件的基名,不包括扩展名
    当有两个限制文件大小的配置同时存在时,需要先满足struts.xml文件中配置的常量文件大小,再满足action中配置的文件大小
6、解决文件扩展名问题
    在action中配置拦截器属性
    <action name="customerAction_*" class="customerAction" method="{1}">
        <!--引入拦截器  -->
        <interceptor-ref name="myInterceptorStack">
            <!-- 设置上传文件的类型 MIME类型之间可以用,隔开-->
            <param name="fileUpload.allowedTypes">image/jpeg</param>
            <!--设置上传文件大小  -->
            <param name="fileUpload.maximumSize">1000000</param>
        </interceptor-ref>
    </action>
三、Struts2支持下的文件下载
3.1 web文件下载步骤
一个流:
  使用response向浏览器输出文件所对应的流
两个头
  设置文件格式  Response.setHeader(“content-type”,”image/jpeg”);
 设置文件以下载方式,并指定文件名称 Response.setheader(“content-disposition”,”attachment;filename=”+filename);
3.2 struts2文件下载步骤
Action类中
/**
 * 处理文件下载的问题
 * */
 * 文件名
String picName = null;
public String download() throws Exception {
    //查询客户详情
    CstCustomerDetail customerDetail = customerDetailService.findById(customer.getCustId());
    if(customerDetail != null){
        picName = customerDetail.getCustPic();
    }
    return "download";
}
/**获取文件输入流
 * @return
 * @throws Exception
 */
public InputStream getInputStream() throws Exception {
    String path = ServletActionContext.getServletContext().getRealPath("/");
    //获取文件
    File file = new File(path+"/WEB-INF/upload/"+picName);

    if(file.exists()){
        //如果文件存在,就返回文件输入流
        return new FileInputStream(file);
    }
    return null;
}

/**获取MIME类型
 * @return
 * @throws Exception
 */
public String getContentType() throws Exception {
    // TODO Auto-generated method stub
    //通过文件名,返回文件MIME类型
    return ServletActionContext.getServletContext().getMimeType(picName);
}

/**弹出框,实现文件下载
 * @return
 * @throws Exception
 */
public String getContentDisposition() throws Exception {
    //得到请求的这个浏览器的版本
    String agent = ServletActionContext.getRequest().getHeader("user-agent");
    //以下载的方式
    return "attachment;filename="+encodeDownloadFilename(picName,agent);

    //return "inline";  浏览器直接打开图片 
}

/**
 * 下载文件时,针对不同浏览器,进行附件名的编码
 * @param filename 下载文件名
 * @param agent 客户端浏览器
 * @return 编码后的下载附件名
 * @throws IOException
 */
public String encodeDownloadFilename(String filename, String agent) throws IOException{
    if(agent.contains("Firefox")){ // 火狐浏览器
        filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
    }else{ // IE及其他浏览器
        filename = URLEncoder.encode(filename,"utf-8");
    }
    return filename;
}

配置文件中 struts-customer.xml
<!--下载文件 -->
    <result name="download" type="stream">
        <!--获取文件MIME类型  -->
        <param name="contentType">${contentType}</param>
        <!--以下载方式返回图片
        ${contentDisposition} ngel表达式,可以调用action中对应的方法
          -->
        <param name="contentDisposition">${contentDisposition}</param>
    </result> 
四、Fastjson的使用
导入jar包fastjson.jar
常用API
    String jsonStr = JSON.toJSONString(Object obj);
    FastJson默认解决对象依赖,循环引用问题,可以手动取消
    JSON.toJSONString(customer,SerializerFeature.DisableCircularReferenceDetect)
使用注解@JSONField(serialize=false)可以将设置指定的属性不转换为json,可以解决对象依赖问题
优点:
    解决了对象依赖的问题,循环引用的问题
    提高了效率
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值