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

时间:2022-11-20 15:30:27

本文实例为大家分享了SpringMvc3+extjs4实现上传下载的具体代码,供大家参考,具体内容如下

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

前台代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<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>

后台代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
*记录返回结果*/
 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(此文件名可能跟项目的实际情况有区别)中的配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 上传文件,限制大小的配置 -->
  <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"/>

以上的就是上传文件了。 

下载呢?

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@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="+name;这样就可以下载了....   超连接的写法基本一样,这里就不多说了.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。