webuploader在springMVC+jquery+Java开发环境下的大文件分片上传

参考的文章

参考的文章http://c7.gg/cd5XT

因为从网上看到的总是和自己项目开发有些许差别,所以也是在调试了很久之后,发现适合自己项目的代码,现在把过程记录下来,以便以后查阅.

注意:

1,webuploader上传组件会和jquery自带的上传组件冲突,所以不要使用<form>标签中添加上传文件的属性;

enctype="multipart/form-data"

2.并且屏蔽ApplicationContext-mvc.xml里面的拦截配置!

 
  1. <!-- 上传拦截,如最大上传值及最小上传值 -->

  2. <!--新增加的webuploader上传组件,必须要屏蔽这里的拦截机制

  3. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >

  4. <property name="maxUploadSize">

  5. <value>1073741824</value>

  6. </property>

  7. <property name="maxInMemorySize">

  8. <value>1073741824</value>

  9. </property>

  10. <property name="defaultEncoding">

  11. <value>utf-8</value>

  12. </property>

  13. </bean>

  14. -->

下面正式开始前后台代码开发:

1.在页面jsp文件中,调用webuploader组件的公共文件

<link rel="stylesheet" href="static/css/webuploader.css" />
 
  1. <script type="text/javascript" src="static/js/webuploader.js"></script>

  2. <script type="text/javascript" src="static/js/webuploader.min.js"></script>

  3. <script type="text/javascript" src="static/js/upload3.js"></script>

页面上的控件代码:

 
  1. <div id="uploader">

  2. <!--用来存放文件信息-->

  3. <div id="thelist"></div>

  4. <div>

  5. <div id="attach"></div>

  6. <!-- <input type="button" value="上传" id="upload"/> -->

  7. </div>

  8. </div>

因为我用的是自动上传,所以注释了上传按钮,upload3.js里也注释了相对的上传按钮的点击方法.

2.真正的上传组件代码是upload3.js,里面介绍了webuploader的初始化,分片,各种参数,具体可以参考官网上的API

 
  1. /*********************************WebUpload 单文件上传 begin*****************************************/

  2. $(function(){

  3. var $list = $("#thelist");

  4. var uploader ;// 实例化

  5. uploader = WebUploader.create({

  6. auto:true, //是否自动上传

  7. pick: {

  8. id: '#attach',

  9. name:"multiFile", //这个地方 name 没什么用,和fileVal 配合使用。

  10. label: '点击选择文件,会自动上传',

  11. multiple:false //默认为true,true表示可以多选文件,HTML5的属性

  12. },

  13. swf: '../Uploader.swf', //在这里必需要引入swf文件,webuploader初始化要用

  14. fileVal:'multiFile', //提交到到后台,是要用"multiFile"这个名称属性来取文件的

  15. server: "myPractice/webUploader.do",

  16. duplicate:true,//是否可重复选择同一文件

  17. resize: false,

  18. chunked: true, //分片处理

  19. chunkSize: 20 * 1024 * 1024, //每片20M

  20. chunkRetry:2,//如果失败,则不重试

  21. threads:1,//上传并发数。允许同时最大上传进程数。

  22. fileNumLimit:1,//上传的文件总数

  23. // 禁掉全局的拖拽功能。

  24. disableGlobalDnd: true

  25. });

  26.  
  27. // 当有文件添加进来的时候

  28. uploader.on( "fileQueued", function( file ) {

  29. console.log("fileQueued:");

  30. $list.append( "<div id='"+ file.id + "' class='item'>" +

  31. "<h4 class='info'>" + file.name + "</h4>" +

  32. "<p class='state'>正在上传...</p>" +

  33. "</div>" );

  34. });

  35.  
  36. //当所有文件上传结束时触发

  37. uploader.on("uploadFinished",function(){

  38. console.log("uploadFinished:");

  39. })

  40.  
  41. //当文件上传成功时触发。

  42. uploader.on( "uploadSuccess", function( file ,response) {

  43. // alert(file.name);

  44. $( "#"+file.id ).find("p.state").text("已上传");

  45. });

  46.  
  47. uploader.on( "uploadError", function( file ) {

  48. $( "#"+file.id ).find("p.state").text("上传出错");

  49. uploader.cancelFile(file);

  50. uploader.removeFile(file,true);

  51. uploader.reset();

  52. });

  53.  
  54. //如果是手动上传,用下面的事件,并启用jsp页面上的上传按钮

  55. // $("#upload").on("click", function() {

  56. // uploader.upload();

  57. // })

  58.  
  59. });

  60. /*********************************WebUpload 单文件上传 end*******************************************/


 

3.前台完毕之后,需要找到后台java代码,实现上传到服务器的功能,webuploader组件中server属性就是指向服务端代码:

 
  1. @Controller

  2. @RequestMapping(value="/myPractice")//这里就是表明上传组件怎么通过server属性找到后端代码的,不要太在意细节

  3. public class MyPracticeController extends BaseController {

	
 
  1. @RequestMapping(method = {RequestMethod.POST}, value = {"/webUploader"})

  2. @ResponseBody

  3. public void webUploader(HttpServletRequest request, HttpServletResponse response) throws Exception {

  4. try {

  5. boolean isMultipart = ServletFileUpload.isMultipartContent(request);

  6. if (isMultipart) {

  7. FileItemFactory factory = new DiskFileItemFactory();

  8. ServletFileUpload upload = new ServletFileUpload(factory);

  9.  
  10. // 得到所有的表单域,它们目前都被当作FileItem

  11. List<FileItem> fileItems = upload.parseRequest(request);

  12.  
  13. String id = "";

  14. String fileName = "";

  15. // 如果大于1说明是分片处理

  16. int chunks = 1;

  17. int chunk = 0;

  18. FileItem tempFileItem = null;

  19.  
  20. for (FileItem fileItem : fileItems) {

  21. if (fileItem.getFieldName().equals("id")) {

  22. id = fileItem.getString();

  23. } else if (fileItem.getFieldName().equals("name")) {

  24. fileName = new String(fileItem.getString().getBytes("ISO-8859-1"), "UTF-8");

  25. } else if (fileItem.getFieldName().equals("chunks")) {

  26. chunks = NumberUtils.toInt(fileItem.getString());

  27. } else if (fileItem.getFieldName().equals("chunk")) {

  28. chunk = NumberUtils.toInt(fileItem.getString());

  29. } else if (fileItem.getFieldName().equals("multiFile")) {

  30. tempFileItem = fileItem;

  31. }

  32. }

  33. //session中的参数设置获取是我自己的原因,文件名你们可以直接使用fileName,这个是原来的文件名

  34. String fileSysName = this.getRequest().getSession().getAttribute("fileSysName").toString();

  35. String realname = fileSysName+fileName.substring(fileName.lastIndexOf("."));//转化后的文件名

  36. this.getRequest().getSession().setAttribute("realname",realname);

  37. String filePath = Const.VIDEOPATHFILE + "sound/";//文件上传路径

  38.  
  39. // 临时目录用来存放所有分片文件

  40. String tempFileDir = filePath + id;

  41. File parentFileDir = new File(tempFileDir);

  42. if (!parentFileDir.exists()) {

  43. parentFileDir.mkdirs();

  44. }

  45. // 分片处理时,前台会多次调用上传接口,每次都会上传文件的一部分到后台

  46. File tempPartFile = new File(parentFileDir, realname + "_" + chunk + ".part");

  47. FileUtils.copyInputStreamToFile(tempFileItem.getInputStream(), tempPartFile);

  48.  
  49. // 是否全部上传完成

  50. // 所有分片都存在才说明整个文件上传完成

  51. boolean uploadDone = true;

  52. for (int i = 0; i < chunks; i++) {

  53. File partFile = new File(parentFileDir, realname + "_" + i + ".part");

  54. if (!partFile.exists()) {

  55. uploadDone = false;

  56. }

  57. }

  58. // 所有分片文件都上传完成

  59. // 将所有分片文件合并到一个文件中

  60. if (uploadDone) {

  61. // 得到 destTempFile 就是最终的文件

  62. File destTempFile = new File(filePath, realname);

  63. for (int i = 0; i < chunks; i++) {

  64. File partFile = new File(parentFileDir, realname + "_" + i + ".part");

  65. FileOutputStream destTempfos = new FileOutputStream(destTempFile, true);

  66. //遍历"所有分片文件"到"最终文件"中

  67. FileUtils.copyFile(partFile, destTempfos);

  68. destTempfos.close();

  69. }

  70. // 删除临时目录中的分片文件

  71. FileUtils.deleteDirectory(parentFileDir);

  72. } else {

  73. // 临时文件创建失败

  74. if (chunk == chunks -1) {

  75. FileUtils.deleteDirectory(parentFileDir);

  76. }

  77. }

  78.  
  79. }

  80. } catch (Exception e) {

  81. logger.error(e.getMessage(), e);

  82. }

  83. }


 

到这里基本完了,webuploader前后台设计的代码就这些,

Uploader.swf   
webuploader.min.js
 
webuploader.js
webuploader.css

因为从网上看到的总是和自己项目开发有些许差别,所以也是在调试了很久之后,发现适合自己项目的代码,现在把过程记录下来,以便以后查阅.

注意:

1,webuploader上传组件会和jquery自带的上传组件冲突,所以不要使用<form>标签中添加上传文件的属性;

enctype="multipart/form-data"

2.并且屏蔽ApplicationContext-mvc.xml里面的拦截配置!

 
  1. <!-- 上传拦截,如最大上传值及最小上传值 -->

  2. <!--新增加的webuploader上传组件,必须要屏蔽这里的拦截机制

  3. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >

  4. <property name="maxUploadSize">

  5. <value>1073741824</value>

  6. </property>

  7. <property name="maxInMemorySize">

  8. <value>1073741824</value>

  9. </property>

  10. <property name="defaultEncoding">

  11. <value>utf-8</value>

  12. </property>

  13. </bean>

  14. -->

下面正式开始前后台代码开发:

1.在页面jsp文件中,调用webuploader组件的公共文件

<link rel="stylesheet" href="static/css/webuploader.css" />
 
  1. <script type="text/javascript" src="static/js/webuploader.js"></script>

  2. <script type="text/javascript" src="static/js/webuploader.min.js"></script>

  3. <script type="text/javascript" src="static/js/upload3.js"></script>

页面上的控件代码:

 
  1. <div id="uploader">

  2. <!--用来存放文件信息-->

  3. <div id="thelist"></div>

  4. <div>

  5. <div id="attach"></div>

  6. <!-- <input type="button" value="上传" id="upload"/> -->

  7. </div>

  8. </div>

因为我用的是自动上传,所以注释了上传按钮,upload3.js里也注释了相对的上传按钮的点击方法.

2.真正的上传组件代码是upload3.js,里面介绍了webuploader的初始化,分片,各种参数,具体可以参考官网上的API

 
  1. /*********************************WebUpload 单文件上传 begin*****************************************/

  2. $(function(){

  3. var $list = $("#thelist");

  4. var uploader ;// 实例化

  5. uploader = WebUploader.create({

  6. auto:true, //是否自动上传

  7. pick: {

  8. id: '#attach',

  9. name:"multiFile", //这个地方 name 没什么用,和fileVal 配合使用。

  10. label: '点击选择文件,会自动上传',

  11. multiple:false //默认为true,true表示可以多选文件,HTML5的属性

  12. },

  13. swf: '../Uploader.swf', //在这里必需要引入swf文件,webuploader初始化要用

  14. fileVal:'multiFile', //提交到到后台,是要用"multiFile"这个名称属性来取文件的

  15. server: "myPractice/webUploader.do",

  16. duplicate:true,//是否可重复选择同一文件

  17. resize: false,

  18. chunked: true, //分片处理

  19. chunkSize: 20 * 1024 * 1024, //每片20M

  20. chunkRetry:2,//如果失败,则不重试

  21. threads:1,//上传并发数。允许同时最大上传进程数。

  22. fileNumLimit:1,//上传的文件总数

  23. // 禁掉全局的拖拽功能。

  24. disableGlobalDnd: true

  25. });

  26.  
  27. // 当有文件添加进来的时候

  28. uploader.on( "fileQueued", function( file ) {

  29. console.log("fileQueued:");

  30. $list.append( "<div id='"+ file.id + "' class='item'>" +

  31. "<h4 class='info'>" + file.name + "</h4>" +

  32. "<p class='state'>正在上传...</p>" +

  33. "</div>" );

  34. });

  35.  
  36. //当所有文件上传结束时触发

  37. uploader.on("uploadFinished",function(){

  38. console.log("uploadFinished:");

  39. })

  40.  
  41. //当文件上传成功时触发。

  42. uploader.on( "uploadSuccess", function( file ,response) {

  43. // alert(file.name);

  44. $( "#"+file.id ).find("p.state").text("已上传");

  45. });

  46.  
  47. uploader.on( "uploadError", function( file ) {

  48. $( "#"+file.id ).find("p.state").text("上传出错");

  49. uploader.cancelFile(file);

  50. uploader.removeFile(file,true);

  51. uploader.reset();

  52. });

  53.  
  54. //如果是手动上传,用下面的事件,并启用jsp页面上的上传按钮

  55. // $("#upload").on("click", function() {

  56. // uploader.upload();

  57. // })

  58.  
  59. });

  60. /*********************************WebUpload 单文件上传 end*******************************************/


 

3.前台完毕之后,需要找到后台java代码,实现上传到服务器的功能,webuploader组件中server属性就是指向服务端代码:

 
  1. @Controller

  2. @RequestMapping(value="/myPractice")//这里就是表明上传组件怎么通过server属性找到后端代码的,不要太在意细节

  3. public class MyPracticeController extends BaseController {

	
 
  1. @RequestMapping(method = {RequestMethod.POST}, value = {"/webUploader"})

  2. @ResponseBody

  3. public void webUploader(HttpServletRequest request, HttpServletResponse response) throws Exception {

  4. try {

  5. boolean isMultipart = ServletFileUpload.isMultipartContent(request);

  6. if (isMultipart) {

  7. FileItemFactory factory = new DiskFileItemFactory();

  8. ServletFileUpload upload = new ServletFileUpload(factory);

  9.  
  10. // 得到所有的表单域,它们目前都被当作FileItem

  11. List<FileItem> fileItems = upload.parseRequest(request);

  12.  
  13. String id = "";

  14. String fileName = "";

  15. // 如果大于1说明是分片处理

  16. int chunks = 1;

  17. int chunk = 0;

  18. FileItem tempFileItem = null;

  19.  
  20. for (FileItem fileItem : fileItems) {

  21. if (fileItem.getFieldName().equals("id")) {

  22. id = fileItem.getString();

  23. } else if (fileItem.getFieldName().equals("name")) {

  24. fileName = new String(fileItem.getString().getBytes("ISO-8859-1"), "UTF-8");

  25. } else if (fileItem.getFieldName().equals("chunks")) {

  26. chunks = NumberUtils.toInt(fileItem.getString());

  27. } else if (fileItem.getFieldName().equals("chunk")) {

  28. chunk = NumberUtils.toInt(fileItem.getString());

  29. } else if (fileItem.getFieldName().equals("multiFile")) {

  30. tempFileItem = fileItem;

  31. }

  32. }

  33. //session中的参数设置获取是我自己的原因,文件名你们可以直接使用fileName,这个是原来的文件名

  34. String fileSysName = this.getRequest().getSession().getAttribute("fileSysName").toString();

  35. String realname = fileSysName+fileName.substring(fileName.lastIndexOf("."));//转化后的文件名

  36. this.getRequest().getSession().setAttribute("realname",realname);

  37. String filePath = Const.VIDEOPATHFILE + "sound/";//文件上传路径

  38.  
  39. // 临时目录用来存放所有分片文件

  40. String tempFileDir = filePath + id;

  41. File parentFileDir = new File(tempFileDir);

  42. if (!parentFileDir.exists()) {

  43. parentFileDir.mkdirs();

  44. }

  45. // 分片处理时,前台会多次调用上传接口,每次都会上传文件的一部分到后台

  46. File tempPartFile = new File(parentFileDir, realname + "_" + chunk + ".part");

  47. FileUtils.copyInputStreamToFile(tempFileItem.getInputStream(), tempPartFile);

  48.  
  49. // 是否全部上传完成

  50. // 所有分片都存在才说明整个文件上传完成

  51. boolean uploadDone = true;

  52. for (int i = 0; i < chunks; i++) {

  53. File partFile = new File(parentFileDir, realname + "_" + i + ".part");

  54. if (!partFile.exists()) {

  55. uploadDone = false;

  56. }

  57. }

  58. // 所有分片文件都上传完成

  59. // 将所有分片文件合并到一个文件中

  60. if (uploadDone) {

  61. // 得到 destTempFile 就是最终的文件

  62. File destTempFile = new File(filePath, realname);

  63. for (int i = 0; i < chunks; i++) {

  64. File partFile = new File(parentFileDir, realname + "_" + i + ".part");

  65. FileOutputStream destTempfos = new FileOutputStream(destTempFile, true);

  66. //遍历"所有分片文件"到"最终文件"中

  67. FileUtils.copyFile(partFile, destTempfos);

  68. destTempfos.close();

  69. }

  70. // 删除临时目录中的分片文件

  71. FileUtils.deleteDirectory(parentFileDir);

  72. } else {

  73. // 临时文件创建失败

  74. if (chunk == chunks -1) {

  75. FileUtils.deleteDirectory(parentFileDir);

  76. }

  77. }

  78.  
  79. }

  80. } catch (Exception e) {

  81. logger.error(e.getMessage(), e);

  82. }

  83. }


 

到这里基本完了,webuploader前后台设计的代码就这些,

Uploader.swf   
webuploader.min.js
 
webuploader.js
webuploader.css
这4个公共文件从官网可以下载,都一样.

猜你喜欢

转载自blog.csdn.net/bzerah/article/details/86688115
今日推荐