本篇的具体思路来源于右侧网址:http://blog.csdn.net/qq_19551571/article/details/49977983

本篇代码有所修改,请具体区分。

本篇使用的是 form 提交,ajax 发送请求(但个人感觉把容器换成 div 之类的也是一样的思路,待验证),提交数据类型 FormData 对象。

H5中 form 表单的代码:

  1. <form class="inpform" id="uploadForm" enctype="multipart/form-data">
  2. <!-- 注意enctype必须得填 -->
  3. <div class="f-inp">
  4. <div><i>请输入您的号码:</i>
  5. <input type="text" name="phone" id="phone" >
  6. </div>
  7.  
  8. <input type="file" id="files" name="files" multiple/> <!-- multiple 确保能选择多文件 -->
  9. </div>
  10. </form>
  11.  
  12. <input type="button" value="提交" onclick="add();">

js、ajax代码:

  1. function add(){
  2. var formData = new FormData($("#uploadForm")[0]);//用form 表单直接 构造formData 对象; 就不需要下面的append 方法来为表单进行赋值了。
  3. $.ajax({
  4. async: false, //要求同步 不是不需看你的需求
  5. url : "/uploadImage/save",
  6. type : 'POST',
  7. data : formData,
  8. processData : false, //必须false才会避开jQuery对 formdata 的默认处理
  9. contentType : false, //必须false才会自动加上正确的Content-Type
  10. success : function(result) {
  11. ...
  12. },
  13. error : function(result) {
  14. ...
  15. }
  16. });
  17. }

java Spring 中的代码:

  1. 处理器
  2. @Controller
  3. @RequestMapping("/uploadImage")
  4. public class UploadController{
  5. @RequestMapping("/savecc")
      //注意传入的参数
  6. public void saveImageCC (@RequestParam(value = "files", required = true)MultipartFile[] multipartFiles ,String phone, HttpServletRequest request)throws Exception{
        ...
  7. //调用文件上传处理类
  8. Map<String, Object> result = UploadFilesUtils_cc.uploadCC(multipartFiles, request, 1, "", phone, 1000, 1000, true);
  9.   ...
      }
    }
  10.  
  11. utils类:
  12. public class UploadFilesUtils_cc {
  13. public static Map<String,Object> uploadCC(MultipartFile[] multipartFiles,HttpServletRequest request, int type,String module,String folder,int width,
  14. int height ,Boolean createFolder)
  15. throws UnsupportedEncodingException ,IOException , URISyntaxException{
  16. request.setCharacterEncoding("utf-8");
  17. //结果集
  18. Map<String, Object> result = new HashMap<>();
  19. //图片集
  20. Map<String, String> data = new HashMap<>();
  21. String uploadPath = "E:/reporitory/static/uploadImg/"+folder;
  22. File file = new File(uploadPath);
  23. if(!file.exists()){
  24. file.mkdirs();
  25. }
  26. try{
  27. Boolean success = true ;
  28. String message = "文件上传失败";
  29. String fieldNames = "";
  30. String urls = "";
  31. String uuid ;
  32.  
  33. for(MultipartFile multipartFile:multipartFiles){
  34. if(multipartFile != null){
  35. //如果fileitem中封装的上传文件,得到上传的文件名称
  36. //filename格式"c:/static/mod/xxx.png"
  37. String filename = multipartFile.getOriginalFilename();
  38. fieldNames += "|" + multipartFile.getName();
  39.  
  40. if(StringUtils.isNotBlank(filename)){
  41. // 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
  42. // c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
  43. // 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
  44. filename = filename.substring(filename.lastIndexOf("/") + 1);
  45. // 得到上传文件的扩展名
  46. String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
  47. // 如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
  48. // 此处是图片格式校验
  49. if((type == Constant.FileType.image.key)
  50. && !UploadFilesUtils_cc.checkIMGType(fileExtName)) {
  51. message = "图片格式不正确,请重新上传";
  52. success = false;
  53. result.put("success", success);
  54. result.put("message", message);
  55. return result;
  56. //break;
  57. } else {
  58. //使用UUID解决文件重名问题
  59. uuid = UUID.randomUUID().toString();
  60.  
  61. //数据库里面需要保存的图片上传的路径
  62. String url = uuid + "." + fileExtName;
  63.  
  64. //获取item中的上传文件输入流
  65. InputStream in = multipartFile.getInputStream();
  66. //创建文件输出流
  67. FileOutputStream out = new FileOutputStream(uploadPath + "\\" + url);
  68. //创建缓冲区
  69. byte[] buffer = new byte[1024];
  70. //判断输入流中的数据是否已经读完的标识
  71. int len = 0;
  72. //循环将输入流读入缓冲区,(len=in.read(buffer))>0就表示in里面还有数据
  73. while((len = in.read(buffer)) > 0){
  74. //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + url)当中
  75. out.write(buffer , 0 , len);
  76. }
  77. //关闭输入流
  78. in.close();
  79. //关闭输出流
  80. out.close();
  81.  
  82. if(StringUtils.isBlank(urls)){
  83. urls = url;
  84. } else {
  85. urls += "|" + url;
  86. }
  87. }
  88. }
  89. //data.put("linked", "..."+folder+"/"+ urls);
  90. //data.put("filename", filename);
  91. }
  92. }
  93. fieldNames = fieldNames.substring(1);
  94. data.put("phone", folder);
  95. data.put("fieldNames", fieldNames);
  96. data.put("linked","..."+folder+"/"+ urls);
  97. result.put("success", true);
  98. result.put("message", "图片上传成功!");
  99. result.put("data",data);
  100.  
  101. return result;
  102. }catch(Exception e){
  103. System.out.println("上传文件出现错误:" + e.getMessage());
  104. return null;
  105. }
  106.  
  107. }
  108. }

利用H5 FormData 实现表单中多图上传(可带其他如String类型数据)的更多相关文章

  1. 重置表单中的文件上传控件(file input)的方法

    方法一: 调用所在 form 表单的 reset 方法,这个方法的缺点是会把整个表单重置,需要存储表单的状态,再回填回去 方法二: 使用jQuery,代码为: $("#id").r ...

  2. 利用html5的FormData对象实现多图上传

    <html> <head> <title>FormData多图上传演示</title> </head> <body> <a ...

  3. 利用Jquery使用HTML5的FormData属性实现对文件的上传

    1.利用Jquery使用HTML5的FormData属性实现对文件的上传 在HTML5以前我们如果需要实现文件上传服务器等功能的时候,有时候我们不得不依赖于FLASH去实现,而在HTML5到来之后,我 ...

  4. 项目总结21:项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库)

    项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库) 备注:本案例,作为Demo,包含少量的项目业务逻辑,input多图上传的逻辑是完整的: 不废话直接上代码 1-前端标 ...

  5. js formData图片上传(单图上传、多图上传)后台java

    单图上传 <div class="imgUp">     <label>头像单图</label>     <input type=&quo ...

  6. 传统表单提交文件上传,以及FormData异步ajax上传文件

    传统的文件上传: 只用将form表单的entype修改成multipart/form-data,然后就可以进行文件上传,这种方式常用并且简单. 以下是另一种方式FormData,有时候我们需要ajax ...

  7. springBoot+ vue+ Element-ui实现合并多图上传(一次请求多张图片)

    这次上传使用的是Elemet-ui的uoload上传组件,组件预留的钩子回调还是比较充足的. 1:  实现多图上传主要用到以下两个属性: 下面讲一下属性使用: <el-upload :actio ...

  8. 怎么样通过php使用html5实现多文件上传?(php多图上传)

    <!DOCTYPE html><html lang="zh-cn"> <head> <meta charset="utf-8&q ...

  9. thinkphp3.2.2有预览的多图上传

    thinkphp3.2.2有预览的多图上传 整体思路 1 封装文件上传和图片上传的类文件 2 视图中添加相关JS和表单提交 3 控制器中添加上传文件的相关代码 一 2个class 文件 请上传到/Th ...

随机推荐

  1. linux安装mysql5.7.19

    0.查看操作系统内核版本 cat /proc/version [admin@octopus-att-d-030098 ~]$ cat /proc/versionLinux version 3.10.0 ...

  2. IDEA+提示“Cannot resolve symbol XXXX”

    问题描述:鼠标放置下图中红色包上提示“Cannot resolve symbol XXXX”信息 解决: File->Invalidate Caches/Restart 清除缓存并重启 idea

  3. java可重入锁reentrantlock

    public class ReentrantDemo { //重入锁 保护临界区资源count,确保多线程对count操作的安全性 /*public static ReentrantLock rtlo ...

  4. Luogu P4205 [NOI2005]智慧珠游戏

    国内少有的可以练习神仙算法--DLX的好题怎么可以被爆搜埋没呢? 看到这题没有DLX的题解所以写一篇,不过貌似我实现的太弱(构图太慢)所以速度上不是很快. 下面开始讲题,但请保证你要先学会DLX.(d ...

  5. [2018福大至诚软工助教]UML设计小结

    [2018福大至诚软工助教]UML设计小结 一.得分 总分(50分) 团队信息 (4分) 队名 (1分) 团队成员的学号与姓名(需要标注队长)(1分) 本次作业的博客链接(1分) 三者完全,4分 团队 ...

  6. OSS网页上传和断点续传(OSS配置篇)

    OSS网页上传和断点续传主要根据BrowserJS-SDK和相关文档整理而得,快速构建OSS上传应用 一.Bucket设置 浏览器中直接访问OSS需要开通Bucket的CORS设置 将allowed ...

  7. snappy

    Snappy 是一个 C++ 的用来压缩和解压缩的开发包.其目标不是最大限度压缩或者兼容其他压缩格式,而是旨在提供高速压缩速度和合理的压缩率.Snappy 比 zlib 更快,但文件相对要大 % 到 ...

  8. PHP之位运算符

    使用场景: 1) 判断奇数偶数 ; $i < ; $i++) { ){ echo $i.PHP_EOL; } } //输出所有奇数 2)快速修改状态 $status1 = ; $status2 ...

  9. js 翻牌活动效果

    直接上代码 html: <div class="index_main"> <ul class="index_card"> <li ...

  10. 解决多人开发时使用window.onload的覆盖问题

    通用型小函数:解决多人开发时,同时使用window.onload事件所出现的后面的window.onload函数覆盖前面一个window.onload函数的问题. function addLoadEv ...