前言:本篇文章主要讲述Ajax和FormData对象配合实现单图片上传,多图片上传,以及和对象的综合上传的功能;上篇博客写了form表单实现上传预览,单图片上传,多图片上传,以及和对象的综合上传的前后端代码。本篇前端不再过多赘述,不涉及预览,只写了简单html代码,后端代码一致,只贴JS。
如有疑惑,请参考上一篇:https://blog.csdn.net/qq_38310446/article/details/87458267
1. Ajax图片上传前端代码
-
1.1 Ajax上传单图片Html代码:
<h1>
ajax上传单个图片
</h1>
<form id="fileForm" name="fileForm" action="#" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="button" value="提交">
</form>
-
1.2 Ajax上传单图片JS代码:
/**
* ajax上传单个图片
*/
$("#fileForm input[type='button']").click(function () {
/**
* 特别注意:fileForm指的是form表单属性name的值
* file是指input控件的name
* */
var file = document.fileForm.file.files[0];
//ormData是Html5新加进来的一个类,可以模拟表单数据
var fm = new FormData();
fm.append('file', file);
//进行Ajax请求
$.ajax({
//几个参数需要注意一下
type: "POST",//方法类型
dataType: "json",//预期服务器返回的数据类型,可以不设置
url: "/admin/company/addCompany",//url
data: fm,
async: false,
cache: false,
contentType: false, //禁止设置请求类型
processData: false, //禁止jquery对DAta数据的处理,默认会处理
success: function (p) {
alert("上传成功")
}
// error: function () {
// alert("异常!");
// }
});
});
-
1.3 Ajax上传多图片Html代码:
<h1>ajax上传多个图片</h1>
<form id="filesForm" name="filesForm" action="#" method="post" enctype="multipart/form-data">
<input type="file" name="files" multiple="multiple"/>
<input type="button" value="提交">
</form>
-
1.4 Ajax上传多张图片Js代码:
/**
* ajax上传多个图片
*/
$("#filesForm input[type='button']").click(function () {
var form=new FormData();
/**
* 特别注意:fileForm,file是指form表单属性name的值
* files是指一个数组
* */
var files = document.filesForm.files.files;
for (var i=0;i<files.length;i++){
form.append("files",files[i])
}
// //进行Ajax请求
$.ajax({
//几个参数需要注意一下
type: "POST",//方法类型
dataType: "json",//预期服务器返回的数据类型,可以不设置
url: "/admin/company/addManyCompany",//url
data: form,
async: false,
cache: false,
contentType: false, //禁止设置请求类型
processData: false, //禁止jquery对DAta数据的处理,默认会处理
success: function () {
alert("上传成功")
}
// error: function () {
// alert("异常!");
// }
});
});
-
1.5 Ajax单个图片,多个图片,对象,综合上传HTML代码:
<h1>添加对象以及单个图片和多个图片</h1>
<form id="fileAndFilesAndObject" name="fileAndFilesAndObject" action="#" method="post" enctype="multipart/form-data">
企业名称:<input type="text" name="name"><br>
手机号: <input type="text" name="mobile"><br>
邮箱: <input type="email" name="email"><br>
企业logo<input type="file" name="file">
企业图片<input type="file" name="files" multiple="multiple">
<input type="button" value="提交">
</form>
-
1.6 Ajax综合上传Js代码:
/**
* 上传单个图片,多个图片,以及对象
*/
$("#fileAndFilesAndObject input[type='button']").click(function () {
var form=new FormData();
/**
* 特别注意:fileAndFilesAndObject,file是指form和input中name的值
* files是指一个数组
* */
var file = document.fileAndFilesAndObject.file.files[0];
form.append("file",file);
var files=document.fileAndFilesAndObject.files.files;
for (var i=0;i<files.length;i++){
form.append("companyFiles",files[i])
}
var name=$("#fileAndFilesAndObject input[type='name']").val();
var mobile=$("#fileAndFilesAndObject input[type='mobile']").val();
var email=$("#fileAndFilesAndObject input[type='email']").val();
form.append("name",name);
form.append("mobile",mobile);
form.append("email",email);
// //进行Ajax请求
$.ajax({
//几个参数需要注意一下
type: "POST",//方法类型
dataType: "json",//预期服务器返回的数据类型,可以不设置
url: "/admin/company/addCompanyOneAndMore",//url
data: form,
async: false,
cache: false,
contentType: false, //禁止设置请求类型
processData: false, //禁止jquery对DAta数据的处理,默认会处理
success: function () {
alert("上传成功")
}
// error: function () {
// alert("异常!");
// }
});
});
有的小伙伴不知道后台上传的方法,,,在这里追贴一下当时的方法吧。
2.上传后端代码
/**
* 上传多图片和添加企业信息
*
* @param request
* @param file
* @param companyFiles
* @param productFiles
* @return
* @throws IOException
*/
@RequestMapping(value = "/addCompanyOneAndMore")
public String addCompanyOneAndMore(
HttpServletRequest request,
@ModelAttribute CompanyEntity companyEntity,
@RequestParam("file") MultipartFile file,
@RequestParam("companyFiles") MultipartFile[] companyFiles,
@RequestParam("productFiles") MultipartFile[] productFiles,Model model) throws IOException {
boolean b = Utils.uploadOneFile(request, file);
if (b) {
String urls = (String) request.getSession().getAttribute("imageUploadUrl");
System.out.println("单个图片上传路径" + urls);
companyEntity.setLogo(urls);
}
boolean b1 = Utils.uploadManyFiles(request, companyFiles);
if (b1) {
String urls = (String) request.getSession().getAttribute("imageUploadUrl");
System.out.println("企业图片路径" + urls);
companyEntity.setCompanyImage(urls);
}
boolean b2 = Utils.uploadManyFiles(request, productFiles);
if (b2) {
String urls = (String) request.getSession().getAttribute("imageUploadUrl");
System.out.println("企业产品路径" + urls);
companyEntity.setProductImage(urls);
}
if (b == true && b1 == true && b2 == true) {
companyService.addCompany(companyEntity);
model.addAttribute("msg","企业信息添加成功!");
model.addAttribute("address","/admin/company/getCompanyByPage");
return "/msg/msg";
}
model.addAttribute("msg","系统繁忙,企业信息添加失败,请稍后再试!");
model.addAttribute("address","/admin/company/getCompanyByPage");
return "/msg/msg";
}
-
2.1 上传的工具类
/**
* 上传单个文件方法
* @param request
* @param file
* @return
* @throws IOException
*/
public static boolean uploadOneFile(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws IOException {
if (!file.isEmpty()) { //如果文件不为空,写入上传路径
String path = request.getSession().getServletContext().getRealPath("/images/upload"); //上传文件路径
//文件原始名字
String filename = file.getOriginalFilename();
String suffixLast = filename.substring(filename.lastIndexOf(".")); //获取文件后缀
String newFileName = Utils.getUUID()+suffixLast; //文件新名字
File filepath = new File(path, newFileName);
判断路径是否存在,如果不存在就创建一个
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();
}
//将上传文件保存到一个目标文件当中
file.transferTo(new File(path + File.separator + newFileName));
String imageUrl="/images/upload/"+newFileName;
request.getSession().setAttribute("imageUploadUrl",imageUrl);
return true;
}
return false;
}
/**
* 上传多个文件方法
* @param request
* @param files
* @return
*/
public static boolean uploadManyFiles(
HttpServletRequest request,
@RequestParam("files") MultipartFile[] files){
String path = request.getSession().getServletContext().getRealPath("/images/upload");
try {
// System.out.println("上传数组图片的长度是"+files.length);
if (files.length!=0){
String s="";
for (int i = 0; i < files.length; i++) {
/**
* 必须进行判断,否则数组会越界
*/
if (files[i].isEmpty()){
return false;
}
//文件原始名字
String filename = files[i].getOriginalFilename();
//获取文件后缀
String suffixLast = filename.substring(filename.lastIndexOf("."));
//文件新名字
String newFileName = Utils.getUUID()+suffixLast;
File filepath = new File(path, newFileName);
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();
}
files[i].transferTo(new File(path + File.separator + newFileName));
s+="/images/upload/"+newFileName+"-";
}
System.out.println("这是我的图片拼接成的数组字符"+s);
request.getSession().setAttribute("imageUploadUrl",s);
return true;
}
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
特别说明:这是当时的代码,符合当时的业务,上传企业和商品信息。 上传的配置以及pom就不贴啦。有不懂得在下方留言,相互交流。
再贴一个上传,,项目本地和target都有,目的是实时获取数据
public static boolean uploadOneFileLayui(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws IOException {
if (!file.isEmpty()) { //如果文件不为空,写入上传路径
String realPath = request.getSession().getServletContext().getRealPath("/");
String path = realPath.split("target")[0];
path=path+"/src/main/webapp/images/upload";//为了不因为target删除后消失,同事上传到本地
String path_target = request.getSession().getServletContext().getRealPath("/images/upload"); //上传文件路径
//文件原始名字
String filename = file.getOriginalFilename();
String suffixLast = filename.substring(filename.lastIndexOf(".")); //获取文件后缀
String newFileName = Utils.getUUID()+suffixLast; //文件新名字
File filepath = new File(path, newFileName);
File target_file = new File(path, newFileName);
判断路径是否存在,如果不存在就创建一个
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();
}
//判断target路径
if (!target_file.getParentFile().exists()) {
target_file.getParentFile().mkdirs();
}
//将上传文件保存到一个目标文件当中
file.transferTo(new File(path + File.separator + newFileName));
file.transferTo(new File(path_target + File.separator + newFileName));
request.getSession().setAttribute("imageUploadUrl",request.getContextPath()+"/images/upload/"+newFileName);
return true;
}
return false;
}
如有不解,请加java爱好群大家交流:852665736;群里都是热心好客的小伙伴,大家一同进步。
无偿免费分享源码以及技术和面试文档,更多优秀精致的源码技术栈分享请关注公众号:gh_817962068649