码迷,mamicode.com
首页 > Web开发 > 详细

Struts2上传于下载技术分析

时间:2018-08-14 14:24:35      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:trident   throws   utils   ack   apach   down   attach   att   ide   

1.上传:请求request--------》struts2的fileUpload拦截器来解析要上传的文件,拿到相应属性数据注入到action-------------》Action中定义成员属性和set方法,用于注入属性值。fileUpload的拦截器部分命名要求源代码如下所示:

if (files != null && files.length > 0) {
       List<File> acceptedFiles = new ArrayList<File>(files.length);
       List<String> acceptedContentTypes = new ArrayList<String>(files.length);
       List<String> acceptedFileNames = new ArrayList<String>(files.length);
       String contentTypeName = inputName + "ContentType";
       String fileNameName = inputName + "FileName";

因此做文件上传的action成员属性要规范命名三个属性,分别是:1.表单中用于文件上传的file属性名要与action中File成员变量的名字相同,在此假设均为X;2.action中用于表示上传文件名称的属性filename必须命名为变量X+"FileName",没有中文乱码(框架解决过了);3.action中用于规定文件MIME类型的属性名称必须命名为变量X+“ContentType",示例如下:

前台页面:

<input type="file" name="upload">

后台action:

// 要上传的文件
 private File upload;
 // 文件的名称(可以是中文,乱码已解决)
 private String uploadFileName;
 // 文件的MIME的类型
 private String uploadContentType;

注:接下来就是这些属性的set方法,用于拦截器向action中注入属性值;文件上传默认大小2M,可在struts2.xml中设置常量修改大小

<constant name="struts.mutipart.maxSize” value="2097152"></constant>

示例代码:

public String save() throws IOException{
  // 做文件的上传,说明用户选择了上传的文件了
  if(uploadFileName != null) {

   // 把文件的名称处理一下,避免文件重名
   String uuidname = UploadUtils.getUUIDName(uploadFileName);
   String path = "E:\\APP\\apache-tomcat-7.0.70\\upload\\";
   // 创建file对象
   File file = new File(path+uuidname);
   // 简单方式
   FileUtils.copyFile(upload, file);
   
   // 把上传的文件的路径,保存到客户表中
   customer.setFilepath(path+uuidname);
  }
  
  // 保存客户成功了
  customerService.save(customer);
  return "save";
 }

2.下载

文件下载的action必须提供一个返回值类型为Inputstream的get方法,按业务来说前台页面会传来文件存储地址filepath和文件名filename;为了解决下载框在不同浏览器内核下出现乱码的问题,需要进行浏览器内核判断然后进行相应的乱码处理,相应代码如下;

//判断浏览器内核代码

public boolean isMSBrowser(HttpServletRequest request) {

  String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};

  String userAgent = request.getHeader("User-Agent");

  for (String signal : IEBrowserSignals) {

   if (userAgent.contains(signal)){

    return true;

   }

  }

  return false;

 }

//解析中文代码

public String getFileName() {
  try {
   HttpServletRequest request = ServletActionContext.getRequest();
   //如果是IE内核使用URLEncoder
   if(isMSBrowser(request)){

    fileName = URLEncoder.encode("供应商资质", "UTF-8");

   }else{//如果是谷歌、火狐则解析为ISO-8859-1

    fileName = new String("供应商资质".getBytes("UTF-8"), "ISO-8859-1");

   }
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return fileName;
 }

//必须提供的返回类型为InputStream的get类型的方法,假设为getXxx(),在该方法里需要再次处理编码

public InputStream getXxx() throws Exception {
  
  HttpServletRequest request = ServletActionContext.getRequest();
  if(isMSBrowser(request)){

   fileName = URLEncoder.encode("供应商资质", "UTF-8");

  }else{//如果是谷歌、火狐则解析为ISO-8859-1

   fileName = new String("供应商资质".getBytes("UTF-8"), "ISO-8859-1");

  }
  File file = new File(filepath);
  return new FileInputStream(file);
 }

//struts.xml配置如下

<!-- 配置文件下载  -->
  <action name="FileDownloadAction" class="FileDownloadAction">
            <result name="success" type="stream">
             <param name="contentType">image/jpeg;</param>
                <param name="contentDisposition">attachment;filename="${fileName}.jpg"</param>
                <param name="inputName">xxx</param>//注意此处命名应与action中定义的流属性名字相同
                <param name="bufferSize">81920</param>
            </result>
        </action>

Struts2上传于下载技术分析

标签:trident   throws   utils   ack   apach   down   attach   att   ide   

原文地址:https://www.cnblogs.com/tfboy/p/9473803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!