当前位置: 移动技术网 > IT编程>开发语言>Java > SpringMvc3+extjs4实现上传与下载功能

SpringMvc3+extjs4实现上传与下载功能

2019年07月22日  | 移动技术网IT编程  | 我要评论

最近生活过的很充实,人一直在不停的忙碌着学习新东西。这是我最近遇到的问题,我找度娘n了很久,终于找到了解决方案!

前台代码:

<script>  
 ext.onready(function() {

    ext.create('ext.form.panel', {
      title : '文件上传',
      width : 400,
      bodypadding : 10,
      frame : true,
      renderto : document.body,
      items : [ {
        xtype : 'filefield',
        name : '文件',
        fieldlabel : 'file',
        labelwidth : 50,
        msgtarget : 'side',
        allowblank : false,
        anchor : '100%',
        buttontext : '请选择文件...'
      } ],

      buttons : [ {
        text : '上传',
        handler : function() {
          var form = this.up('form').getform();
          if (form.isvalid()) {
            form.submit({
              url : '根路径/fileuploaddown/fileupload',
              waitmsg : '正在上传文件中...',
              success : function(fp, o) {
                ext.msg.alert('上传文件成功!');
              }
            });
          }
        }
      } ]
    });

  });
</script>

后台代码:

/**
*记录返回结果*/
 class extjsformresult {

  private boolean success;

  public boolean issuccess() {
    return success;
  }

  public void setsuccess(boolean success) {

  }

  public string tostring() {
    return "{success:" + this.success + "}";
  }
}
 

class fileuploadbean {

    private commonsmultipartfile file;

    public commonsmultipartfile getfile() {
      return file;
    }

    public void setfile(commonsmultipartfile file) {
      this.file = file;
    }
}

/**
 * 文件的上传与下载
 * @author administrator
 *
 */
@controller
@requestmapping(value = "/fileuploaddown")
public class fileuploadanddowncontroller {
  
  private static int countter=1; //定义一个计数器,用于上传文件的重命名
  
  @autowired
  private proannexdao<proannex> proannextdao;
  
  

  public void setproannextdao(proannexdao<proannex> proannextdao) {
    this.proannextdao = proannextdao;
  }

  @requestmapping(value="fileupload",method = requestmethod.post)
  public @responsebody string create(redirectattributes redirectattributes,fileuploadbean uploaditem, 
      bindingresult result,httpsession session){
    //获取根路径
    string uploadfolderpath = session.getservletcontext().getrealpath("/"); 
    extjsformresult extjsformresult = new extjsformresult();
    try {
      
      if (result.haserrors()) {
        for (objecterror error : result.getallerrors()) {
          system.err.println("error: " + error.getcode() + " - "
              + error.getdefaultmessage());
        }

        // 设置extjs返回 - error
        extjsformresult.setsuccess(false);

        return extjsformresult.tostring();
      }

      multipartfile file = uploaditem.getfile();
      string filename = null;
      inputstream inputstream = null;
      outputstream outputstream = null;
      if(file.getsize()>0){
         system.out.println("file size:::" + file.getsize());
        if(file.getsize()>5242880){
           system.out.println("file size:::" + file.getsize());
           extjsformresult.setsuccess(false);
          return "error";
        }
        
       inputstream = file.getinputstream();
    
       file newfile = new file(uploadfolderpath + "fileupload/");
       //如果文件路径不存在就新建一个
       if(!newfile.exists()){
         newfile.mkdirs();
       }
       //获取文件名
       string name=file.getoriginalfilename();
       //从数据库中查询存在此类文件名否
        long count=proannextdao.isrepeatname(name);
        //如果存在一样的文件名,就进行从命名
        if (count>0) {
          name=name.substring(0, name.lastindexof("."))+"("+(countter++)+")"+name.substring(name.lastindexof("."));
        }
        
        filename = uploadfolderpath + "fileupload/" + name;
        outputstream = new fileoutputstream(filename); 
        int readbytes = 0;
        byte[] buffer = new byte[10000];
        while ((readbytes = inputstream.read(buffer, 0, 10000)) != -1) {
            outputstream.write(buffer, 0, readbytes);
        }
        
        outputstream.close();
        inputstream.close();
       
        
      }

      // 设置extjs返回 - sucsess
      extjsformresult.setsuccess(true);
    } catch (exception e) {
      
      e.printstacktrace();
      // 设置extjs返回 - error
    
      extjsformresult.setsuccess(false);
    }
    

    return extjsformresult.tostring();
  }
  

}

springmvc.xml(此文件名可能跟项目的实际情况有区别)中的配置:

<!-- 上传文件,限制大小的配置 -->
   <bean id="multipartresolver"
    class="org.springframework.web.multipart.commons.commonsmultipartresolver">
     <!--resolvelazily属性启用是为了推迟文件解析,以便在upload中捕获文件大小异常-->
    <property name="resolvelazily" value="true"/>
    <property name="maxuploadsize" value="5242880" />
  </bean>
  
  
  <!-- 将无法mapping到controller的path交给default servlet handler处理   -->  
  <mvc:default-servlet-handler/><!-- 使用默认的servlet来响应静态文件 -->
  <!-- 文件的上传与下载 -->
  <mvc:view-controller path="/" view-name="redirect:/fileuploaddown"/>

以上的就是上传文件了。 

下载呢?

下载比较简单,代码如下:

@requestmapping("/downloadfile") 
  public void download(@valid @modelattribute("downloadname") string downloadname,
      httpservletresponse response,httpsession session,bindingresult result,httpservletrequest request) throws ioexception { 
    
    response.setcharacterencoding("utf-8");
    request.setcharacterencoding("utf-8");
    //获取文件的路径
    string url=session.getservletcontext().getrealpath("/")+"/fileupload/"+downloadname;
    system.out.println(url);
    file file=new file(url);
    
    inputstream input = fileutils.openinputstream(file); 
    byte[] data = ioutils.tobytearray(input); 
 
    //system.out.println("文件名:"+downloadname);
    response.reset(); 
   //设置响应的报头信息(中文问题解决办法)
    response.setheader("content-disposition","attachment;filename="+urlencoder.encode(downloadname, "utf-8"));
    response.addheader("content-length", "" + data.length); 
    response.setcontenttype("application/octet-stream; charset=utf-8"); 
    
    ioutils.write(data, response.getoutputstream()); 
    ioutils.closequietly(input); 
    
  }

在界面上只要有一个连接地址:如:window.location.href="根路径/fileuploaddown/downfile/downloadname=" rel="external nofollow" +name;这样就可以下载了....   超连接的写法基本一样,这里就不多说了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网