`
java_2007
  • 浏览: 121274 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

EXT2.0+STRUTS2框架下的文件上传和中文文件下载

    博客分类:
  • java
阅读更多

1.struts-xml配置文件的设置:

                <constant name="struts.multipart.maxSize" value="15097152"/><!-- 文件上传中整个请求内容允许的最大字节数为15M -->

 

                 <!-- 提供文件上传功能 -->
                <interceptor-ref name="fileUpload"/>

 

     <!--  附件 Action -->
     <action name="attachmentsAction" class="*.*.action.AttachmentsAction">
      <!--这里这个设置是必须的。不要调用文件拦截器。。后面在ACTION就可以知道此处的重要性--!>

        <interceptor-ref name="fileUploadStack"/>
      <result type="json"></result>
     </action>

 

2.ext页面attachment.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<html>
  <head>

    <title>附件管理</title>
  
 <link href="/ext/resources/css/ext-all.css" rel="stylesheet" type="text/css" />
 <script language="JavaScript" type="text/javascript" src="/ext/ext-base.js"></script>
 <script language="JavaScript" type="text/javascript" src="/ext/ext-all.js"></script>
 <script language="JavaScript" type="text/javascript" src="/ext/ext-lang-zh_CN.js"></script> 

 <script language="JavaScript" type="text/javascript">

 var center;
 var addFrom;
 Ext.onReady(function(){
    
       addForm = new Ext.FormPanel({
    id: 'addForm',
       fileUpload:true,  
       frame:true,
       labelWidth: 60, 
       bodyStyle: 'padding:5px 5px 0',  
       labelAlign:'left',  
       items:[{ 
     border: false,
     layout:'column',
     collapsible: true, 
     items: [{   
                  columnWidth : 0.98, 
                  border: false,
                   layout : 'form',  
                   defaultType : 'textfield',  
                   items : [
                    
        {fieldLabel:'文件1', xtype:'textfield', inputType:'file', name: 'upload', cls:'nobordertext', anchor:'98%',allowBlank: true},
                    {fieldLabel: '摘要1',  maxLength:'255', name: 'description', maxLengthText:'供方负责人的字数不能超过50', anchor:'98%'}
                    ,{fieldLabel:'文件2', xtype:'textfield', inputType:'file', name: 'upload', cls:'nobordertext', anchor:'98%'},
                    {fieldLabel: '摘要2',  maxLength:'255', name: 'description', maxLengthText:'供方负责人的字数不能超过50', anchor:'98%'},
           {fieldLabel:'文件3', xtype:'textfield', inputType:'file', name: 'upload', cls:'nobordertext', anchor:'98%'},
           {fieldLabel: '摘要3',  maxLength:'255', name: 'description', maxLengthText:'供方负责人的字数不能超过50', anchor:'98%'}
                   ]
                  }
     ]
    }
    ],
    buttons: [
     {text: '确定',handler: saveForm},
     {text: '关闭',handler: function(){
       addForm.getForm().reset();
       window.close();
      }
     }
    ]
   });
       center = new Ext.Panel({
          id: 'center',
          region:'center',
          border: false,
          autoScroll: true,
    enableTabScroll:true,
          items: [addForm]
      });
   var panel = new Ext.Panel({
    id: 'panel',
       layout:'fit',
       border: false,
       items: [center]
   });
       
       var viewport = new Ext.Viewport({
    id: 'viewport',
       layout: 'fit',
       autoScroll: true,
       items:[panel]
   });
       
 });
 
 function saveForm(){
  var _url ="/*/*/attachmentsAction!saveAttachmentsInfo.html";
  addForm.getForm().submit({
   url: _url,
   method: 'post',
   //params:{fkId: addForm.findById("fkId").getValue()},
   //提交成功的回调函数
   success:function(form,action){
    if (action.result.msg=='success') {
     addForm.getForm().reset();
     window.close();
    } else if (action.result.msg=='notFile') {
     Ext.Msg.alert('提示','上传的文件不存在!请重试!');
    } else if(action.result.msg=='SizeLimitExceededException') {
     Ext.Msg.alert('提示','您上传的文件太大!文件不能超过15M');
    }
   },
   failure:function(form,action){
     Ext.MessageBox.hide();
    Ext.MessageBox.alert('Error',action.result.msg);
    Ext.Msg.alert('错误','服务器出现错误请稍后再试!');
   }
  });
 }
 </script>
  </head>
 
  <body>
  </body>
</html>

3.java处理页面AttachmentsAction.java

{

 

    //这里对应的是EXT页面定义的file控件的NAME名称。。这个是struts2提供给我们的属性

    //您可以修改成其他的名称,,只要upload ,uploadFileName,uploadContentType 保持一致即可

    private List<File> upload = new ArrayList<File> ();
    private List<String> uploadFileName = new ArrayList<String> ();
    private List<String> uploadContentType = new ArrayList<String> ();
    private List<String> description = new ArrayList<String> ();
   final static int MAX_SIZE = 15 * 1024 * 1024; // 设置上传文件最大为 15M
   final static String dir = "/Attachments/";

 

   。。省略掉set。get方法

 

     /**
  * 保存多个Attachments对象。
  * 这里介绍的是把文件保存到服务器的文件夹中。。并不是保存在数据库里.
  * author by xj
  * @return
  * @throws Exception
  */
 public String saveAttachmentsInfo() throws Exception {

  //取的系统当前时间
  Calendar cal1 = new GregorianCalendar();
  SimpleDateFormat theDate = new SimpleDateFormat("yyyy-MM-dd");
  String strDate = theDate.format(cal1.getTime());
        String year = "2000";
        String month = "12";
        if (strDate.length() > 9) {
         year = strDate.substring(0,4);
         month = strDate.substring(5,7);
        }
        //得到文件的相对路径
        String uploadDir = dir + year + "/" + month + "/";
        //获得文件的绝对路径
     String realUploadDir = ServletActionContext.getServletContext().getRealPath(uploadDir);
     // the directory to upload to用于存放上传文件的目录
  File dirPath = new File(realUploadDir);
     if (!dirPath.exists()) {
        dirPath.mkdirs();
     }
  String name = "";
  String address = "";
  String measurements = "";
  String descriptionName = "";
     String link = "";
     String msg = "{success:true, msg:'failure'}";
     if (upload.size() > 0){
      for(int i=0; i < upload.size();i++){
       Boolean isFile = upload.get(i).exists();
       if (isFile){
     //保存附件数据库信息
     //取得原始文件名
     name = uploadFileName.get(i);
     //取得文件的后缀名
     String suffix = "";
     if (name != null && (!name.equals(""))){
      attachments.setName(name);
      if (name != null && (!name.equals(""))) {
       suffix = name.substring(name.lastIndexOf("."), name.length());
      }
     }
     //对数据库操作... 这里我们需要的是记录的ID作为保存文件的名字
     attachments = new Attachments();
     String aId = attachmentsManager.createAttachmentsInfo(attachments);
     String fileUrl = realUploadDir + "/" + aId + suffix;
     this.copy(upload.get(i), new File(fileUrl));
           link = link + "文件名为" + name + " 上传成功!/n";
           msg = "{success:true, msg:'success', link:'" + link + "'}";
       }else{
              link = "上传的文件不存在";
           msg = "{success:true, msg:'notFile', link:'" + link + "'}";
       }
   }
     } else {
         link = "文件太大";
      msg = "{success:true, msg:'SizeLimitExceededException', link:'" + link + "'}";
     }
     HttpServletResponse response = ServletActionContext.getResponse();
     response.reset();
     response.setContentType("text/html;charset=UTF-8");
     out = response.getWriter();
     out.print(msg);
     return NONE;
 }
 private void copy(File src, File dst) throws Exception{
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(src);
            out = new FileOutputStream(dst);
            byte[] buffer = new byte[8192];
         int bytesRead;
         while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {
          out.write(buffer, 0, bytesRead);
         }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != in) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != out) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

 /**
  * 从服务器上下载文件
  * @return
  * @throws Exception
  */
 public String downLoadFileInfo() throws Exception{
  logger.info("=============AttachmentsAction downLoadFileInfo=============");
  HttpServletRequest req = ServletActionContext.getRequest();
  this.setSuccess(true);
  HttpServletResponse response = ServletActionContext.getResponse();
  response.reset();
  String id = req.getParameter("id");
  if (id != null && (!id.equals(""))) {
   Attachments attachments = attachmentsManager.getAttachmentsInfoById(id);
            //获得文件的绝对路径的前缀
            String path = ServletActionContext.getServletContext().getRealPath(attachments.getAddress());
   //取得文件的后缀名
   String suffix = "";
   if (attachments.getName() != null && (!attachments.getName().equals("")))
    suffix = attachments.getName().substring(attachments.getName().lastIndexOf("."), attachments.getName().length());
            //获得文件在服务器中的名字
            String systemFileName = id + suffix;
            //获得文件的在服务器上的绝对路径
            String realPath = path + "\\" + systemFileName;
            //当文件名是中文时
            //String downFileName = new String(attachments.getName().getBytes("ISO8859-1"), "UTF-8");//这里我不需要做这次转换
            String downFileName = attachments.getName();
   //设置响应头和下载保存的文件名
   response.setContentType("application/msdownload;charset=UTF-8");

//这里就是解决中文名称文件下载的关键地方
   response.setHeader("Content-Disposition","attachment; filename=\"" + java.net.URLEncoder.encode(downFileName, "UTF-8"));
   //打开文件的输出流
   BufferedOutputStream  bufferedOutputStream  =  new  BufferedOutputStream(response.getOutputStream());
   this.downLoadFileFromSystem(realPath, bufferedOutputStream);
  }
     return NONE;
 }
 
 /**
  * 从服务器上下载文件
  * @param realPath
  * @param bufferedOutputStream
  * @throws Exception
  */
 private void downLoadFileFromSystem(String realPath, BufferedOutputStream bufferedOutputStream) throws Exception{
  try {
   //打开指定文件的流信息
   FileInputStream fileInputStream = new FileInputStream(realPath); 
   int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = fileInputStream.read(buffer, 0, 8192)) != -1) {
             bufferedOutputStream.write(buffer,0,bytesRead);
            }
            fileInputStream.close();
            bufferedOutputStream.close();
  } catch (Exception e) {
      e.printStackTrace();
  }
    }

 

 

}

 

4.这里所用到的commons-fileupload-1.1.1.jar。不能使用commons-fileupload-1.0.jar文件。。因为我们需要的是文件拦截器需要用到的是org.apache.commons.fileupload.servlet.servletfileupload.  1.0的jar不支持。。

同时建议两个架包不要同时使用。

分享到:
评论

相关推荐

    ext2.0+struts2.1+spring2.0+jdbc框架

    NULL 博文链接:https://wuyecheng.iteye.com/blog/611124

    EXT3.0+Struts2.0 树控件代码示例

    用EXT3.0+Struts2.0框架写的树控件的代码示例,放在web工程下面直接可以跑了

    struts2.0+spring2.2+ibatis+quartz+extjs3.0 短信调度平台

    采用了struts2.0,spring2.2,ibatis,quartz,extjs3.0 实现了关于短信的调度框架,对接收人维护,动态添加每日短信数据,编写短信模版,最后通过quartz定时发送,因为短信接口收费所以不提供,需要jar包自己下载,...

    struts2+spring2.5+hibernate3+ext2.2 (含源代码和数据库) 2.0 分卷2

    这个就算是2.0版本吧,和上次发的系统相比: 这次将列表改成异步传输 并且修改了系统中的表单和按钮,使界面更加美观 修改了部分模块的JS错误 去掉了一些模块只保留最基本的功能 文件有2个,因为大小超过了20M 分卷1 2分...

    gwtext无缝整合struts2

    研究gwt+ext+ssh框架整合编写的一个实例,实例中包括一个说明文档(google plugin创建gwt实例说明、gwt-ext实例的创建、gwt-ext与struts2整合实例说明);还包括文档对应的myeclipse项目。相关的包稍微有点大,没有...

    hibernate325ga+struts2011+spring25实现crud

    本框架选用的技术struts2.0.11,hibernate3.2.5ga,spring-framework-2.5,oracle92,少量采用ext-2.0脚本技术,IDE-myeclipse601 部署时,可修改web-inf/config/spring/applicationContext.xml文件,修改相应的数据库信息...

    (2.0版本)自己写的struts2+hibernate+spring实例

    所以没有上传导入的jar,其实就是默认的struts2和hibernate以及spring的包.该项目使用的jar包为以下. spring-beans.jar xwork-2.0.4.jar spring-context.jar ognl-2.6.11.jar spring-web.jar ...

    SSH和Ext整合 更新

    模拟登录界面,加入验证码,xml树的实现 Ext viewport框架 等好多东西,都是自己在学习ext中想到什么就做个例子,只是有点乱,...在javascript目录下加入Ext2.0 在lib下加入所需要的jar 数据库是mysql 详见sql文件夹

    基于EXT技术的网上订单管理系统

    主要开发的工具有MyEclipse 6.0 ,数据库为Mysql,应用服务器为tomcat5.X,对EXT的使用参考了官方网站上的EXT2.0版本。该平台的实现过程中,涉及的工作包括:(1)页面设计,总体设计的讨论; (2)网站公告的管理;(3)...

    AJAX 入门视频之 Ext 2.0.1 & DWR 1表格实时编辑器实例

    然而大部分都是基于 Ext 1 开发, 而 2.0 的呢, 大多又找不到源码下载, 而且其类库比较复杂, 所以今天做它是花了一番功夫,不过当最后的结果出来后, 一切辛苦都显的那么值得了, 学技术,归根到底就是一种学习和总结的...

    iuhyiuhkjh908u0980

    本章我们将会开发基于Struts2框架的Hello World.我们的Hello World程序是你开发基于Struts2框架程序的第一步.这里我们会提供循序渐进的教程来开发基于Struts2框架的Hello World程序. 教程包含基本的步骤像创建目录...

    ibeshmet framework

    该框架提供了完整的Web应用解决方案,UI使用当前流行的ExtJS2.0,表现层框架为Struts2,事务管理由Spring2.0处理,持久层使用Ibatis2.3。该框架已经基于上述技术,提供了如页面框架、身份验证、用户管理和权限管理等...

    开源框架jar包(百度云盘)

     · struts2-2.2.1-all.zip · struts-2.1.8.1-all.zip · hibernate-distribution-3.6.0.Final-dist.zip  · hibernate-distribution-3.5.1-Final-dist.zip  · hibernate-release-4.2.4.Final.zip spring-...

    图书管理系统(B/S)

    图书管理系统后台(B/S架构) 实现语言java 主要有 ssh框架技术 (struts2.0) JPA 后台页面ExtJs2.0 实现 数据库 sql2005

    java进销存系统

    代码百分之百可以运行,是经过严格测试过了的,而且框架也是最新的,所以才要...里面附带文档和数据库执行文件,遇到问题可以咨询我,采用技术是:Struts2.0 、Spring 2.5 、Hibernate3 、Ext js 3.3,欢迎大家来下载。

Global site tag (gtag.js) - Google Analytics