利用H5 FormData 实现表单中多图上传(可带其他如String类型数据)
本篇的具体思路来源于右侧网址:http://blog.csdn.net/qq_19551571/article/details/49977983
本篇代码有所修改,请具体区分。
本篇使用的是 form 提交,ajax 发送请求(但个人感觉把容器换成 div 之类的也是一样的思路,待验证),提交数据类型 FormData 对象。
H5中 form 表单的代码:
<form class="inpform" id="uploadForm" enctype="multipart/form-data">
<!-- 注意enctype必须得填 -->
<div class="f-inp">
<div><i>请输入您的号码:</i>
<input type="text" name="phone" id="phone" >
</div> <input type="file" id="files" name="files" multiple/> <!-- multiple 确保能选择多文件 -->
</div>
</form> <input type="button" value="提交" onclick="add();">
js、ajax代码:
function add(){
var formData = new FormData($("#uploadForm")[0]);//用form 表单直接 构造formData 对象; 就不需要下面的append 方法来为表单进行赋值了。
$.ajax({
async: false, //要求同步 不是不需看你的需求
url : "/uploadImage/save",
type : 'POST',
data : formData,
processData : false, //必须false才会避开jQuery对 formdata 的默认处理
contentType : false, //必须false才会自动加上正确的Content-Type
success : function(result) {
...
},
error : function(result) {
...
}
});
}
java Spring 中的代码:
处理器
@Controller
@RequestMapping("/uploadImage")
public class UploadController{
@RequestMapping("/savecc")
//注意传入的参数
public void saveImageCC (@RequestParam(value = "files", required = true)MultipartFile[] multipartFiles ,String phone, HttpServletRequest request)throws Exception{
...
//调用文件上传处理类
Map<String, Object> result = UploadFilesUtils_cc.uploadCC(multipartFiles, request, 1, "", phone, 1000, 1000, true);
...
}
} utils类:
public class UploadFilesUtils_cc {
public static Map<String,Object> uploadCC(MultipartFile[] multipartFiles,HttpServletRequest request, int type,String module,String folder,int width,
int height ,Boolean createFolder)
throws UnsupportedEncodingException ,IOException , URISyntaxException{
request.setCharacterEncoding("utf-8");
//结果集
Map<String, Object> result = new HashMap<>();
//图片集
Map<String, String> data = new HashMap<>();
String uploadPath = "E:/reporitory/static/uploadImg/"+folder;
File file = new File(uploadPath);
if(!file.exists()){
file.mkdirs();
}
try{
Boolean success = true ;
String message = "文件上传失败";
String fieldNames = "";
String urls = "";
String uuid ; for(MultipartFile multipartFile:multipartFiles){
if(multipartFile != null){
//如果fileitem中封装的上传文件,得到上传的文件名称
//filename格式"c:/static/mod/xxx.png"
String filename = multipartFile.getOriginalFilename();
fieldNames += "|" + multipartFile.getName(); if(StringUtils.isNotBlank(filename)){
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
// c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf("/") + 1);
// 得到上传文件的扩展名
String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
// 如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
// 此处是图片格式校验
if((type == Constant.FileType.image.key)
&& !UploadFilesUtils_cc.checkIMGType(fileExtName)) {
message = "图片格式不正确,请重新上传";
success = false;
result.put("success", success);
result.put("message", message);
return result;
//break;
} else {
//使用UUID解决文件重名问题
uuid = UUID.randomUUID().toString(); //数据库里面需要保存的图片上传的路径
String url = uuid + "." + fileExtName; //获取item中的上传文件输入流
InputStream in = multipartFile.getInputStream();
//创建文件输出流
FileOutputStream out = new FileOutputStream(uploadPath + "\\" + url);
//创建缓冲区
byte[] buffer = new byte[1024];
//判断输入流中的数据是否已经读完的标识
int len = 0;
//循环将输入流读入缓冲区,(len=in.read(buffer))>0就表示in里面还有数据
while((len = in.read(buffer)) > 0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + url)当中
out.write(buffer , 0 , len);
}
//关闭输入流
in.close();
//关闭输出流
out.close(); if(StringUtils.isBlank(urls)){
urls = url;
} else {
urls += "|" + url;
}
}
}
//data.put("linked", "..."+folder+"/"+ urls);
//data.put("filename", filename);
}
}
fieldNames = fieldNames.substring(1);
data.put("phone", folder);
data.put("fieldNames", fieldNames);
data.put("linked","..."+folder+"/"+ urls);
result.put("success", true);
result.put("message", "图片上传成功!");
result.put("data",data); return result;
}catch(Exception e){
System.out.println("上传文件出现错误:" + e.getMessage());
return null;
} }
}
利用H5 FormData 实现表单中多图上传(可带其他如String类型数据)的更多相关文章
- 重置表单中的文件上传控件(file input)的方法
方法一: 调用所在 form 表单的 reset 方法,这个方法的缺点是会把整个表单重置,需要存储表单的状态,再回填回去 方法二: 使用jQuery,代码为: $("#id").r ...
- 利用html5的FormData对象实现多图上传
<html> <head> <title>FormData多图上传演示</title> </head> <body> <a ...
- 利用Jquery使用HTML5的FormData属性实现对文件的上传
1.利用Jquery使用HTML5的FormData属性实现对文件的上传 在HTML5以前我们如果需要实现文件上传服务器等功能的时候,有时候我们不得不依赖于FLASH去实现,而在HTML5到来之后,我 ...
- 项目总结21:项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库)
项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库) 备注:本案例,作为Demo,包含少量的项目业务逻辑,input多图上传的逻辑是完整的: 不废话直接上代码 1-前端标 ...
- js formData图片上传(单图上传、多图上传)后台java
单图上传 <div class="imgUp"> <label>头像单图</label> <input type=&quo ...
- 传统表单提交文件上传,以及FormData异步ajax上传文件
传统的文件上传: 只用将form表单的entype修改成multipart/form-data,然后就可以进行文件上传,这种方式常用并且简单. 以下是另一种方式FormData,有时候我们需要ajax ...
- springBoot+ vue+ Element-ui实现合并多图上传(一次请求多张图片)
这次上传使用的是Elemet-ui的uoload上传组件,组件预留的钩子回调还是比较充足的. 1: 实现多图上传主要用到以下两个属性: 下面讲一下属性使用: <el-upload :actio ...
- 怎么样通过php使用html5实现多文件上传?(php多图上传)
<!DOCTYPE html><html lang="zh-cn"> <head> <meta charset="utf-8&q ...
- thinkphp3.2.2有预览的多图上传
thinkphp3.2.2有预览的多图上传 整体思路 1 封装文件上传和图片上传的类文件 2 视图中添加相关JS和表单提交 3 控制器中添加上传文件的相关代码 一 2个class 文件 请上传到/Th ...
随机推荐
- java 1.5 自动拆箱和装箱的注意事项
背景 java1.5后引入了自动装箱和自动拆箱的概念 自动拆箱:将引用类型转化为基本数据类型 自动装箱:将基本数据类型装为引用类型 但是实际使用中,什么情况自动拆箱什么情况自动装箱呢? 自动装箱 In ...
- node.js读写文件
关于node.js的读写操作,应用场景有很多.比如其中这样的一个场景,如何获取全局的token.这就涉及到写和读操作了. 写操作: var fs = require("fs"); ...
- node.js之express框架
之前学习过node.js接触过express框架,最近为了编写一个mock server正好用到了express.下面正好就跟大家介绍一下关于express.今天的内容主要围绕这么几个方面? expr ...
- springboot使用lettuce连接池
springboot对连接池的使用非常智能,配置文件中添加lettuce.pool相关配置,则会使用到lettuce连接池,并将相关配置设置为连接池相关参数,(前提是这些参数是springboot配置 ...
- randi( )函数--MATLAB
randi()函数生成均匀分布的伪随机整数,范围为imin--imax,如果没指定imin,则默认为1. r = randi(imax,n):生成n*n的矩阵 r = randi(imax,m,n): ...
- Kubernetes学习之路(26)之kubeasz+ansible部署集群
目录 1.环境说明 2.准备工作 3.分步骤安装 3.1.创建证书和安装准备 3.2.安装etcd集群 3.3.安装docker 3.4.安装master节点 3.5.安装node节点 3.6.部署集 ...
- 教你使用HTML5原生对话框元素,轻松创建模态框组件
HTML 5.2草案加入了新的dialog元素.但是是一种实验技术. 以前,如果我们想要构建任何形式的模式对话框或对话框,我们需要有一个背景,一个关闭按钮,将事件绑定在对话框中的方式安排我们的标记,找 ...
- ECS上配置FTP Filezilla
又来搞华为ECS 第一,服务器安装服务端 第二,设置被动模式,把服务器的公网IP填好 第三,生成一个服务器证书,客户端连接时接受 第四,设置自定义的被动连接端口比如 9000-9050 第五,去ECS ...
- iOS使用XZMRefresh实现UITableView或UICollectionView横向刷新
https://blog.csdn.net/u013285730/article/details/50615551?utm_source=blogxgwz6 XZMRefresh The easies ...
- .net之httphandler小记
本地调试代码遇到的一个问题,没有走URL路由器(UrlReWriter : IHttpHandlerFactory),于是网上科普了一下原理,主要有两点: 1.asp.net在处理http请求时,会由 ...