参考资料:1.SpringMVC上传文件的 4 种方式你都会么| SpringMVC第6篇2.https://blog.csdn.net/justry_deng/article/details/80972817/3.springboot实现本地存储文件上传及提供http访问服务目录⏹后端接收方式1---原生方式接收⏹后端接收方式2---MultipartHttpServletRequest接口接收⏹后端接收方式3---自定义实体类接收⏹SpringBoot接收文件保存到本地磁盘需求: 上传文件分别存到两个List中,两个List和json数据同时提交到后端⏹前端HTML!DOCTYPEhtmlhtmllangenxmlns:thhttp://www.thymeleaf.orgheadmetacharsetUTF-8titleTitle/title/headbodyh1文件上传/h1文件上传1inputclassfileTest1typefile文件上传2inputclassfileTest1typefile文件上传3inputclassfileTest1typefilehr文件上传11inputclassfileTest2typefile文件上传22inputclassfileTest2typefile文件上传33inputclassfileTest2typefilehrbuttonidbtn文件上传/button/bodyscriptth:src{js/jquery.min.js}/scriptscript// 点击发送Ajax请求$(#btn).on(click,function(){// 构建一个FormData对象varformDatanewFormData();// 获取上传的所有文件,并进行遍历$(.fileTest1).each(function(){// this代表上传的每一个文件constfile1Listthis.files[0];if(!!file1List){formData.append(files1,file1List);}});// files1这个key中同时存储着文件和字符串formData.append(files1,testString);$(.fileTest2).each(function(){// this代表上传的每一个文件constfile2Listthis.files[0];if(!!file2List){formData.append(files2,file2List);}});// 将对象序列化为字符串传到后端// 要发送的参数constparams1{name:wangwu,age:30,card:[abc,bbc]};formData.append(jsonData1,JSON.stringify(params1));formData.append(jsonData1,1);formData.append(jsonData1,测试信息);formData.append(jsonData1,[名字,年龄,住址]);constparams2{name:zhaoliu,age:20};formData.append(jsonData2,JSON.stringify(params2));$.ajax({// 请求地址url:/wjec/groupFileUpload2,type:post,// 因为我们要同时将json和文件数据同时提交到后端,所以需要使用FormData这个对象// 该对象可以同时存储json和文件二进制流数据data:formData,/* jQuery的ajax()方法发送的数据默认是序列化后的字符串,因此processData的值默认为true 我们要同时传输文件和表单数据所以将contentType设置为false,告诉jQuery不要将要发送的数据处理为字符串 */processData:false,// 告诉jQuery不要去设置Content-Type请求头// FormDate对象是XMLHttpRquest2的类型,利用XHR对象发送FormDate生成的数据时,可以直接发送,不需要设置头部,// XHR对象能够会自动识别数据类型是FormDate的实例,并配置相关的头部.contentType:false,// 请求成功以后函数被调用success:function(response){// response为服务器端返回的数据,方法内部会自动将json字符串转换为json对象console.log(response);}})});/script/html⏹后端接收方式1—原生方式接收PostMapping(/groupFileUpload)ResponseBodypublicStringgroupFileUpload(MultipartFile[]files1,MultipartFile[]files2,StringjsonData1,StringjsonData2){System.out.println(jsonData1);System.out.println(jsonData2);ListMultipartFilemultipartFiles1Arrays.asList(files1);ListMultipartFilemultipartFiles2Arrays.asList(files2);returngroupFileUpload;}⏹后端接收方式2—MultipartHttpServletRequest接口接收通过MultipartHttpServletRequest接口来处理文件上传1、springmvc 接受到上传文件的的请求之后会将请求转换为 MultipartHttpServletRequest 类型的对象2、MultipartHttpServletRequest 中提供了一系列方法来获取请求中的所有参数信息3、其中 getParameterMap()用来获取非文件类型的参数列表4、getMultiFileMap()方法用来获取上传的文件列表PostMapping(/groupFileUpload1)ResponseBodypublicStringgroupFileUpload1(MultipartHttpServletRequestrequest){MapString,String[]parameterMaprequest.getParameterMap();// 前端放到jsonData1key中的value会以数组的方式进行存储String[]paramsparameterMap.get(jsonData1);System.out.println(Arrays.toString(params));String[]params2parameterMap.get(jsonData2);System.out.println(Arrays.toString(params2));// 在书写js的时候,files1同时存储着文件和json信息,通过这种方式可以将json信息获取出来String[]files1parameterMap.get(files1);System.out.println(Arrays.toString(files1));// 获取前端传入后端的文件MultiValueMapString,MultipartFilemultiFileMaprequest.getMultiFileMap();ListMultipartFilemultipartFiles1multiFileMap.get(files1);ListMultipartFilemultipartFiles2multiFileMap.get(files2);returngroupFileUpload;}⏹后端接收方式3—自定义实体类接收自定义一个实体类importorg.springframework.web.multipart.MultipartFile;importjava.util.List;publicclassFileUploadEntity{privateString[]jsonData1;privateString[]jsonData2;privateListMultipartFilefiles1;privateListMultipartFilefiles2;// ...省略get和set方法}通过实体类的方式接收PostMapping(/groupFileUpload2)ResponseBodypublicStringgroupFileUpload2(FileUploadEntityentity){String[]jsonData1entity.getJsonData1();System.out.println(Arrays.toString(jsonData1));String[]jsonData2entity.getJsonData2();System.out.println(Arrays.toString(jsonData2));ListMultipartFilefiles1entity.getFiles1();ListMultipartFilefiles2entity.getFiles2();returngroupFileUpload;}⏹SpringBoot接收文件保存到本地磁盘配置文件# 端口号设置server.port:8082# 应用程序的上下文设置server.servlet.context-path:/wjec#上传文件的最大限制spring.servlet.multipart.max-file-size 300MB spring.servlet.multipart.max-request-size 900MB# 关闭模板的缓存,默认是开启的spring.thymeleaf.cachefalse# 自定义保存文件的位置web.upload-path:D:/data/#除了带上Spring Boot默认的静态资源路径之外加上file:${web.upload-path}指向外部的文件资源上传路径。该路径下的静态资源可以直接对外提供HTTP访问服务。#spring.resources.static-locations的方式已经过时,现在需要通过下面的配置方式指定spring.web.resources.static-locations classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}后端处理importorg.springframework.util.MultiValueMap;importorg.springframework.web.multipart.MultipartFile;importorg.springframework.web.multipart.MultipartHttpServletRequest;importorg.springframework.web.util.UriComponentsBuilder;ControllerpublicclassFileUploadController{// 绑定文件上传路径到uploadPathValue(${web.upload-path})privateStringuploadPath;// 注入上下文对象的urlValue(${server.servlet.context-path})privateStringcontextPath;privateSimpleDateFormatsdfnewSimpleDateFormat(yyyy/MM/dd/);PostMapping(/groupFileUpload1)ResponseBodypublicStringgroupFileUpload1(MultipartHttpServletRequestrequest){// 通过日期对上传的文件归类保存Stringformatsdf.format(newDate());FilefoldernewFile(uploadPathformat);if(!folder.isDirectory()){folder.mkdirs();}// 获取前端上传的文件MultiValueMapString,MultipartFilemultiFileMaprequest.getMultiFileMap();// 存储静态资源访问url的ListArrayListStringurlListnewArrayList();// 获取files1为key的上传文件列表ListMultipartFilemultipartFiles1multiFileMap.get(files1);try{for(MultipartFilemultipartFile:multipartFiles1){// 对上传的文件重命名避免文件重名StringoldNamemultipartFile.getOriginalFilename();StringnewNameUUID.randomUUID().toString()oldName.substring(oldName.lastIndexOf(.),oldName.length());// 文件保存multipartFile.transferTo(newFile(folder,newName));// 通过工具类构造静态资源访问urlUriComponentsBuilderuriComponentsBuilderUriComponentsBuilder.newInstance();uriComponentsBuilder.scheme(request.getScheme()).host(request.getServerName()).port(request.getServerPort()).path(contextPath/).path(formatnewName).build();urlList.add(uriComponentsBuilder.toUriString());}}catch(IOExceptione){System.out.println(e);}// 打印存储到本地磁盘资源的访问urlSystem.out.println(urlList.toString());return;}}
SpringBoot 上传文件到本地磁盘
参考资料:1.SpringMVC上传文件的 4 种方式你都会么| SpringMVC第6篇2.https://blog.csdn.net/justry_deng/article/details/80972817/3.springboot实现本地存储文件上传及提供http访问服务目录⏹后端接收方式1---原生方式接收⏹后端接收方式2---MultipartHttpServletRequest接口接收⏹后端接收方式3---自定义实体类接收⏹SpringBoot接收文件保存到本地磁盘需求: 上传文件分别存到两个List中,两个List和json数据同时提交到后端⏹前端HTML!DOCTYPEhtmlhtmllangenxmlns:thhttp://www.thymeleaf.orgheadmetacharsetUTF-8titleTitle/title/headbodyh1文件上传/h1文件上传1inputclassfileTest1typefile文件上传2inputclassfileTest1typefile文件上传3inputclassfileTest1typefilehr文件上传11inputclassfileTest2typefile文件上传22inputclassfileTest2typefile文件上传33inputclassfileTest2typefilehrbuttonidbtn文件上传/button/bodyscriptth:src{js/jquery.min.js}/scriptscript// 点击发送Ajax请求$(#btn).on(click,function(){// 构建一个FormData对象varformDatanewFormData();// 获取上传的所有文件,并进行遍历$(.fileTest1).each(function(){// this代表上传的每一个文件constfile1Listthis.files[0];if(!!file1List){formData.append(files1,file1List);}});// files1这个key中同时存储着文件和字符串formData.append(files1,testString);$(.fileTest2).each(function(){// this代表上传的每一个文件constfile2Listthis.files[0];if(!!file2List){formData.append(files2,file2List);}});// 将对象序列化为字符串传到后端// 要发送的参数constparams1{name:wangwu,age:30,card:[abc,bbc]};formData.append(jsonData1,JSON.stringify(params1));formData.append(jsonData1,1);formData.append(jsonData1,测试信息);formData.append(jsonData1,[名字,年龄,住址]);constparams2{name:zhaoliu,age:20};formData.append(jsonData2,JSON.stringify(params2));$.ajax({// 请求地址url:/wjec/groupFileUpload2,type:post,// 因为我们要同时将json和文件数据同时提交到后端,所以需要使用FormData这个对象// 该对象可以同时存储json和文件二进制流数据data:formData,/* jQuery的ajax()方法发送的数据默认是序列化后的字符串,因此processData的值默认为true 我们要同时传输文件和表单数据所以将contentType设置为false,告诉jQuery不要将要发送的数据处理为字符串 */processData:false,// 告诉jQuery不要去设置Content-Type请求头// FormDate对象是XMLHttpRquest2的类型,利用XHR对象发送FormDate生成的数据时,可以直接发送,不需要设置头部,// XHR对象能够会自动识别数据类型是FormDate的实例,并配置相关的头部.contentType:false,// 请求成功以后函数被调用success:function(response){// response为服务器端返回的数据,方法内部会自动将json字符串转换为json对象console.log(response);}})});/script/html⏹后端接收方式1—原生方式接收PostMapping(/groupFileUpload)ResponseBodypublicStringgroupFileUpload(MultipartFile[]files1,MultipartFile[]files2,StringjsonData1,StringjsonData2){System.out.println(jsonData1);System.out.println(jsonData2);ListMultipartFilemultipartFiles1Arrays.asList(files1);ListMultipartFilemultipartFiles2Arrays.asList(files2);returngroupFileUpload;}⏹后端接收方式2—MultipartHttpServletRequest接口接收通过MultipartHttpServletRequest接口来处理文件上传1、springmvc 接受到上传文件的的请求之后会将请求转换为 MultipartHttpServletRequest 类型的对象2、MultipartHttpServletRequest 中提供了一系列方法来获取请求中的所有参数信息3、其中 getParameterMap()用来获取非文件类型的参数列表4、getMultiFileMap()方法用来获取上传的文件列表PostMapping(/groupFileUpload1)ResponseBodypublicStringgroupFileUpload1(MultipartHttpServletRequestrequest){MapString,String[]parameterMaprequest.getParameterMap();// 前端放到jsonData1key中的value会以数组的方式进行存储String[]paramsparameterMap.get(jsonData1);System.out.println(Arrays.toString(params));String[]params2parameterMap.get(jsonData2);System.out.println(Arrays.toString(params2));// 在书写js的时候,files1同时存储着文件和json信息,通过这种方式可以将json信息获取出来String[]files1parameterMap.get(files1);System.out.println(Arrays.toString(files1));// 获取前端传入后端的文件MultiValueMapString,MultipartFilemultiFileMaprequest.getMultiFileMap();ListMultipartFilemultipartFiles1multiFileMap.get(files1);ListMultipartFilemultipartFiles2multiFileMap.get(files2);returngroupFileUpload;}⏹后端接收方式3—自定义实体类接收自定义一个实体类importorg.springframework.web.multipart.MultipartFile;importjava.util.List;publicclassFileUploadEntity{privateString[]jsonData1;privateString[]jsonData2;privateListMultipartFilefiles1;privateListMultipartFilefiles2;// ...省略get和set方法}通过实体类的方式接收PostMapping(/groupFileUpload2)ResponseBodypublicStringgroupFileUpload2(FileUploadEntityentity){String[]jsonData1entity.getJsonData1();System.out.println(Arrays.toString(jsonData1));String[]jsonData2entity.getJsonData2();System.out.println(Arrays.toString(jsonData2));ListMultipartFilefiles1entity.getFiles1();ListMultipartFilefiles2entity.getFiles2();returngroupFileUpload;}⏹SpringBoot接收文件保存到本地磁盘配置文件# 端口号设置server.port:8082# 应用程序的上下文设置server.servlet.context-path:/wjec#上传文件的最大限制spring.servlet.multipart.max-file-size 300MB spring.servlet.multipart.max-request-size 900MB# 关闭模板的缓存,默认是开启的spring.thymeleaf.cachefalse# 自定义保存文件的位置web.upload-path:D:/data/#除了带上Spring Boot默认的静态资源路径之外加上file:${web.upload-path}指向外部的文件资源上传路径。该路径下的静态资源可以直接对外提供HTTP访问服务。#spring.resources.static-locations的方式已经过时,现在需要通过下面的配置方式指定spring.web.resources.static-locations classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}后端处理importorg.springframework.util.MultiValueMap;importorg.springframework.web.multipart.MultipartFile;importorg.springframework.web.multipart.MultipartHttpServletRequest;importorg.springframework.web.util.UriComponentsBuilder;ControllerpublicclassFileUploadController{// 绑定文件上传路径到uploadPathValue(${web.upload-path})privateStringuploadPath;// 注入上下文对象的urlValue(${server.servlet.context-path})privateStringcontextPath;privateSimpleDateFormatsdfnewSimpleDateFormat(yyyy/MM/dd/);PostMapping(/groupFileUpload1)ResponseBodypublicStringgroupFileUpload1(MultipartHttpServletRequestrequest){// 通过日期对上传的文件归类保存Stringformatsdf.format(newDate());FilefoldernewFile(uploadPathformat);if(!folder.isDirectory()){folder.mkdirs();}// 获取前端上传的文件MultiValueMapString,MultipartFilemultiFileMaprequest.getMultiFileMap();// 存储静态资源访问url的ListArrayListStringurlListnewArrayList();// 获取files1为key的上传文件列表ListMultipartFilemultipartFiles1multiFileMap.get(files1);try{for(MultipartFilemultipartFile:multipartFiles1){// 对上传的文件重命名避免文件重名StringoldNamemultipartFile.getOriginalFilename();StringnewNameUUID.randomUUID().toString()oldName.substring(oldName.lastIndexOf(.),oldName.length());// 文件保存multipartFile.transferTo(newFile(folder,newName));// 通过工具类构造静态资源访问urlUriComponentsBuilderuriComponentsBuilderUriComponentsBuilder.newInstance();uriComponentsBuilder.scheme(request.getScheme()).host(request.getServerName()).port(request.getServerPort()).path(contextPath/).path(formatnewName).build();urlList.add(uriComponentsBuilder.toUriString());}}catch(IOExceptione){System.out.println(e);}// 打印存储到本地磁盘资源的访问urlSystem.out.println(urlList.toString());return;}}