SpringMVC+uploadify文件上传

前言

准备筹划一个自己的个人网站,初步的架构设计采用SSH(Spring-MVC,Spring,Hibernate),在这里

顺便记录一下设计和开发过程,以备参考。后续会陆续更新文档,如有任何问题,欢迎各位不吝指出,共

同学习。

环境

开发环境 版本
eclipse 4.3.2
maven 3.2.1
Spring-MVC 3.2.3.RELEASE
Spring Spring
Hibernate 3.2.5

文件上传是很多项目都会使用到的功能,SpringMVC当然也提供了这个功能。不过本人不建议在项目中

通过form表单来提交文件上传,这样做的局限性很大。对于文件上传等类似的功能,推荐使用第三方的

插件(或者自己写的插件)来实现,这样可以减轻服务端的压力,同时呈现的页面效果也会更好,而且

可插拔,扩展性好。

在这里使用AJAX来上传文件,为了方便,使用了第三方的插件uploadify(http://www.uploadify.com/ ),

这个插件展示效果很好,还提供了丰富的功能,在下面的内容中会简单介绍,有兴趣的朋友可以到官网

去看下文档,简单易用。

这里依然借助了SpringMVC的文件上传功能,不过十三哥建议还是不要这样做,这里纯粹是为了介绍

SpringMVC的文件上传而已。

还是希望能使用完整的前后端结合的文件上传插件,把文件上传的功能独立出来。这样页面上就只显示

一个已上传的文件在服务端的保存地址,这个地址对应于数据库表中的URL字段。这样显示文件列表的

时候,服务端也只是从表中取出一系列的URL,再交由读文件的插件去读文件,这将会是非常好的一个

设计了。

使用SpringMVC的文件上传功能,需要引入相应的jar包,配置文件解析器。

【添加处理文件上传的jar包】

pom.xml添加commons-io和commons-fileupload的依赖

<!-- 文件上传 begin-->
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.4</version>
</dependency>
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3</version>
</dependency>
<!-- 文件上传 end-->

【springMVC-servlet.xml配置文件解析器】

<!--    SpringMVC上传文件时,处理文件的解析器,还可以配置文件的大小和异常处理-->
<!--    但是在后端配置文件的大小是不明智的,一般前端的上传文件插件中都提供了这个功能,
所以在前端设置会更好-->
<bean id="multipartResolver" 
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

另外,大家也会发现,SpringMVC的Resolver(解析器)是个很关键的东西,需要什么样的处理,就引入

什么样的解析器就行了。

【Controller代码】

package com.xbs.ready.ssh.controller;import com.alibaba.fastjson.JSON;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;/*** 文件上传的Controller** @author ssg*/
@Controller
@RequestMapping("upload")
public class FileUploadController {  private static final String FILE_PATH = "C:/uploaddir";  @RequestMapping(value = "one", method = RequestMethod.POST)
  @ResponseBody
  public String uploadFile(HttpServletRequest request, HttpServletResponse 
response) throws IOException {
    //String fileName = (String)request.getAttribute("filename");
    MultipartHttpServletRequest multipartRequest = 
(MultipartHttpServletRequest) request;
    Iterator<String> fileNames = multipartRequest.getFileNames();
    MultipartFile multipartFile = multipartRequest.getFile(fileNames.next());
    //如果使用firebug,或者chrome的开发者工具,可以看到,这个文件上传工具发送了两个文件名
    //分别是:name="Filedata"; filename="AVScanner.ini"
    //用这两个文件名获得文件内容都可以,只不过第一个没有后缀,需要自己处理
    //第二个是原始的文件名,但是这个文件名有可能是上传文件时的全路径
    //例如  C:/testssh/a.log,如果是全路径的话,也需要处理
    String fileAlias = multipartFile.getName();
    System.out.println("Spring MVC获得的文件名:" + fileAlias);
    //获得文件原始名称
    String name = multipartFile.getOriginalFilename();
    String filePath = FILE_PATH + "/" + name;
    saveFile(filePath, multipartFile.getBytes());
    Map<String, String> resultMap = new HashMap<String, String>(5);
    resultMap.put("result", "success");
    resultMap.put("filePath", filePath);
    return JSON.toJSONString(resultMap);
  }  //保存文件的方法
  public void saveFile(String filePath, byte[] content) throws IOException {
    BufferedOutputStream bos = null;
    try {
      File file = new File(filePath);
      //判断文件路径是否存在
      if (!file.getParentFile().exists()) {
        //文件路径不存在时,创建保存文件所需要的路径
        file.getParentFile().mkdirs();
      }
      //创建文件(这是个空文件,用来写入上传过来的文件的内容)
      file.createNewFile();
      bos = new BufferedOutputStream(new FileOutputStream(file));
      bos.write(content);
    } catch (FileNotFoundException e) {
      throw new FileNotFoundException("文件不存在。");
    } finally {
      if (null != bos) {
        bos.close();
      }
    }
  }}

【HTML代码】

html文件路径:.../webapp/views/upload.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" 
       href="http://localhost:8080/sshdemo/static/css/uploadify.css">
    <script type="text/javascript" 
src="http://localhost:8080/sshdemo/static/js/jquery-1.7.2.min.js"></script>
    <script type="text/javascript" 
src="http://localhost:8080/sshdemo/static/js/jquery.uploadify.js"></script>
    <meta name="viewport" content="width=device-width">
    <title>文件上传</title>
    <script type="text/javascript">
      $(document).ready(function() {
        fileUpload();
      });
      function fileUpload() {
        $("#upload").uploadify({
          "uploader": "http://localhost:8080/sshdemo/upload/one",
          "method": "post",
          "progressData": "percentage",
          "swf": "http://localhost:8080/sshdemo/static/flash/uploadify.swf",
          "buttonText": "选择要上传的文件",
          "multi": true,
          "fileSizeLimit": "100KB",
          "queueSizeLimit": 5,
          "successTimeout": 600,
          "onUploadSuccess": function(file, data, response) {
            alert('The file ' + file.name 
            + ' was successfully uploaded with a response of ' 
            + response + ':' + data);
          },
          "onUploadError": function(file, errorCode, errorMsg, 
            errorString) {
              alert('The file ' + file.name 
              + ' could not be uploaded: ' + errorString);
          },
          "onSelectError": function() {
            alert('The file ' + file.name 
            + ' returned an error and was not added to the queue.');
          }
        });      }
    </script>
  </head>
  <body>
    <form enctype="multipart/form-data">
      <input id="upload" type="file" />
    </form>
  </body>
</html>

访问

访问路径:http://localhost:8080/sshdemo/views/upload.html

(或者通过访问Controller,然后跳转回这个页面,不过不建议这样做,尽量不去

打扰服务端)

uploadify介绍

这里只简要介绍上面使用的几个参数,其余的可以参照官方文档(http://www.uploadify.com/documentation/ )

uploader:服务端处理上传文件的路径

"uploader": "http://localhost:8080/sshdemo/upload/one"

method:访问方式,post,get(这个访问方式要与服务的访问方式一致,否则405)

"method": "post"

progressData:上传进度,有percentage(百分比)和speed(进度条)两个值

"progressData": "percentage"

swf:动画文件的路径,因为要演示上传进度,所以需要动画(这个文件在官网的zip包里有,可以直接

使用)

"swf": "http://localhost:8080/sshdemo/static/flash/uploadify.swf"

buttonText:上传按钮的名字

"buttonText": "选择要上传的文件"

multi:是否可一次上传多个文件,true:可以,false:不可以(默认false)

"multi": true

fileSizeLimit:文件大小的限制(这里指单个文件),单位可以有B,KB,MB,和GB,默认是KB,

不过建议显式指定,方便理解;这个参数设置也可以代替在后台的配置文件中指定可上传文件的大小

"fileSizeLimit": "100KB"

queueSizeLimit:可上传文件的个数,如果不指定那么没有上限,建议指定的好

"queueSizeLimit": 5

successTimeout:上传文件后,多长时间服务端没有响应就意为上传成功,单位是秒(这时可能服务端

出错了,但是服务端处理的时间超过了这里设置的时间,那么插件会认为上传成功了)

"successTimeout": 60

onUploadSuccess:上传文件成功后,触发的事件

@Param file:上传成功的那个文件对象
@Param data:服务端返回的数据,这个例子中返回的是JSON数据
@Param response:服务端的响应,true 或者 false(注意:如果服务端在超过了
successTimeout之后返回了false,那么插件依然会返回true"onUploadSuccess": function(file, data, response) {alert('The file ' + file.name + ' was successfully uploaded with a response of ' + response + ':' + data);
}

onUploadError:上传文件失败后,触发的事件

@Param file:上传的文件对象
@Param errorCode:错误代码(这个代码是插件返回的,不是服务端)
@Param errorMsg:错误信息(插件返回的错误信息)
@Param errorString:详细的错误信息"onUploadError": function(file, errorCode, errorMsg, errorString) {alert('The file ' + file.name + ' could not be uploaded: ' + errorString);
}

onSelectError:选择上传文件出错时(例如 queueSizeLimit=5,但是选择了6个文件),可以触发这个

事件;文件上传失败时,也可以触发这个事件

@Param file:上传的文件对象
@Param errorCode:错误代码(QUEUE_LIMIT_EXCEEDEDFILE_EXCEEDS_SIZE_LIMITZERO_BYTE_FILEINVALID_FILETYPE@Param errorMsg:错误信息
"onSelectError": function() {alert('The file ' + file.name + ' returned an error and was not added to the queue.');
}

这里就介绍这几个参数了,官网还有好多参数,触发事件,方法等,等以后用到了再介绍吧。

【问题说明】

由于没有保存之前的错误信息,所以暂时没有什么问题要解决了,要个各位有问题

的话,可以提出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌浏览器怎么更新升级 谷歌浏览器手动更新方法

谷歌浏览器怎么更新升级?作为走在网页浏览器行业最前端的浏览器&#xff0c;谷歌相当受欢迎。浏览器的升级是为了修复漏洞和完善浏览器的功能&#xff0c;但有时候浏览器本身并不会自动升级&#xff0c;当你的电脑管家也没有提醒你软件升级的时候&#xff0c;我们如何手动给谷…

Easyui动态加载后台数据的例子

JS: /**接口验证查询按钮*/ function strategyCheckSearch(){var strategyRows $("#strategyCheckDg").datagrid(getRows);var strategyIp $("#strategyIp").val().trim();var strategyPort $("#strategyPort").val().trim();if(strategyIp.le…

火狐怎么在线升级 火狐浏览器在线升级方法分享

想要尝试最新版本的火狐浏览器&#xff0c;不仅可以前往火狐官网下载最新版本的客户端&#xff0c;还可以将现有的版本进行升级。那么&#xff0c;火狐该怎么在线升级呢?下面小编就来分享一下火狐浏览器在线升级的方法&#xff0c;不清楚具体操作的朋友可以稍作参考。 方法步…

win7系统任务管理器如何强制关闭程序

win7系统是一款大家用了都说好的系统&#xff0c;最近一直有很多的小伙伴们反应不知道win7任务管理器如何强制关闭程序?今天小编就为大家带来了win7系统任务管理器强制关闭程序的方法&#xff0c;让我们一起来看看吧。 win7系统任务管理器如何强制关闭程序&#xff1a; 1、按…

jquery获取checkbox是否选中

$(#checkbox).attr(checked); 返回的是checked或者是undefined&#xff0c;不是原来的true和false了&#xff0c;有关此问题的解决方法如下: <input typecheckbox idcb/> <script> //获取是否选中 var isChecked $(#cb).prop(checked); //或 var isChecked …

win7让任务管理器pid显示出来的方法

win7怎么让任务管理器pid显示出来?win7系统是一款优秀的电脑系统。各种各样的设置都可以帮助用户们更好的使用win7系统&#xff0c;今天小编为大家带来的就是win7任务管理器pid显示出来的设置方法一起来看看吧。 win7让任务管理器pid显示出来的方法&#xff1a; 1、鼠标右键…

stream+springmvc实现文件断点续传

手上有个文件上传的需求&#xff0c;并且要支持断点续传最好要兼容性好一些&#xff0c;之前用过uploadify这个jquery上传插件&#xff0c;但是首先它不支持断点续传而且HTML5版本的竟然要收费&#xff0c;秉承中国特色这里就不予考虑了&#xff1b;于是在网上找到了一个叫 Str…

UC浏览器怎么删除收藏历史?UC浏览器删除收藏历史的操作方法

uc浏览器怎么删除收藏历史?在使用的一个uc浏览器中&#xff0c;就会对浏览器中做删除收藏操作&#xff0c;小编告诉大家怎么删除收藏历史?在使用浏览器的时候&#xff0c;当时搜索的时候&#xff0c;也是是当时需要的&#xff0c;之后就不需要了&#xff0c;那么这个时候就可…

spring注解( @Autowired、@Qualifier、@Resource、@PostConstruct、@PreDestroy、 @Component、@Scope)-描述的比较清楚

概述&#xff1a;注释配置相对于 XML 配置具有很多的优势&#xff1a; 它可以充分利用 Java 的反射机制获取类结构信息&#xff0c;这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时&#xff0c;我们就不需要指定 PO 的属性名、类型等信息&#xff0c;如果关系…

傲游浏览器能改字体吗 网页字体设置方法简述

将网页字体调整为喜欢的格式&#xff0c;在一定程度上也能提高用户的使用体验&#xff0c;因此傲游浏览器推出了个性化的“网页字体更改”功能。那么&#xff0c;该如何使用这一功能呢?下面小编就来简单介绍一下傲游浏览器网页字体的设置方法&#xff0c;感兴趣的朋友不妨多多…

QQ浏览器如何开启夜间模式 夜间模式使用技巧分享

在夜晚长时间且高亮度的使用了QQ浏览器后&#xff0c;眼睛不免会觉得干涩。而开启QQ浏览器中的黑暗模式&#xff0c;则可以在一定程度上缓解这一问题!那么&#xff0c;QQ浏览器要如何开启夜间模式呢?下面小编就来分享一下QQ浏览器夜间模式的使用技巧&#xff0c;感兴趣的朋友不…

使用jackson对Java对象与JSON字符串相互转换的一些总结

总结一下自己使用 jackson 处理对象与 JSON 之间相互转换的心得。jackson 是一个用 Java 编写的&#xff0c;用来处理 JSON 格式数据的类库&#xff0c;它速度非常快&#xff0c;目前来看使用很广泛&#xff0c;逐渐替代了 Gson 和 json-lib 。 如果直接引入 jar 包&#xff0…

火狐怎么放大页面?火狐浏览器页面放大技巧

和许多浏览器产品一样&#xff0c;火狐浏览器也支持用户对当前页面进行缩放。当然&#xff0c;不同浏览器产品&#xff0c;页面缩放功能隐藏的位置也各不相同!那么&#xff0c;火狐怎么放大页面呢?下面是小编分享的火狐浏览器页面放大技巧&#xff0c;感兴趣的朋友可不要错过了…

JSON和JS对象之间的互转

1. jQuery插件支持的转换方式 $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2. 浏览器支持的转换方式(Firefox&#xff0c;chrome&#xff0c;opera&#xff0c;safari&#xff0c;ie9&#xff0c;ie8)等浏览器&#xff1a; JSON.pa…

森林中的三个小矮人

今天七小编分享经典童话故事《森林中的三个小矮人》&#xff0c;故事中两个小姑娘&#xff0c;一位心地善良&#xff0c;说话会吐出金子;一位丑陋坏心&#xff0c;说话会吐出蛤蟆;来看看怎么回事吧! 从前&#xff0c;一位死了妻子的男人和一位死了丈夫的女人结了婚&#xff0c…

转码与重定向的区别之于SpringMVC

使用转发时&#xff0c;JSP容器将使用一个内部的方法来调用目标页面&#xff0c;新的页面继续处理同一个请求&#xff0c;而浏览器将不会知道这个过程。 与之相反&#xff0c;重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因此转发要比重定向更快,而且跳转到的…

Spring的ApplicationEvent的使用

Spring的ApplicationEvent的使用 Spring 3.0中提供了很多类似*Aware的类&#xff0c;其中ApplicationContextAware接口可以实现我们在初始化bean的时候给bean注入ApplicationConxt&#xff08;Spring上下文对象&#xff09;对象。ApplicationContextAware接口提供了publishEven…

谷歌浏览器地址栏记录怎么删除 Chrome浏览器地址栏记录清除方法

相信那些经常使用谷歌Chrome浏览器的朋友都清楚&#xff0c;这款浏览器软件会在地址栏保存大量的访问记录&#xff0c;其中也包括一些不想保存下来的!那么&#xff0c;谷歌浏览器地址栏记录要怎么删除呢?不清楚具体方法的朋友&#xff0c;还不赶紧收藏学习一下。 方法步骤 在…

使用Java的BlockingQueue实现生产者-消费者

BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具。 BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类 1、ArrayBlockingQueue&#xff1a;一个由数组支持的有界阻塞队列&#xff0c;规定大小的BlockingQueue,其构造函数必须带一个int参数…

win7系统怎么查看主板信息

win7系统怎么查看主板信息?主板是一台计算机最重要的硬件设备之一&#xff0c;它不仅是所有硬件系统的核心&#xff0c;也是机箱中最大的电路板。今天小编就给大家带来了win7系统查看主板信息的方法&#xff0c;一起来看看win7系统怎么查看主板信息的吧。 win7系统怎么查看主…