前端:

FormDate:
FormDate一个WebAPI接口,是用来将表单数据组合成key/value的键值对形式的工具

  1. <input type="file" id="fileInput" onchange="uploadFile()" multiple>
  2. <input type="text" name="name">
  3. <script>
  4. function uploadFile() {
  5. //js文件上传对象
  6. var file = new FormData();
  7. //console.log("长度:"+$('#fileInput')[0].files.length)
  8. //遍历所有文件
  9. for (var i = 0; i < $('#fileInput')[0].files.length; i++) {
  10. //向formData对象中追加文件对象, $('#fileInput')[0].files[0]表示第一个文件,
  11. //$('#fileInput')[0]等同于getElementById('id')[0],从当前DOM对象中取得文件对象
  12. file.append("files", $('#fileInput')[0].files[i])
  13. }
  14. //将其他数据追加进FormDate,可以是任意类型
  15. file.append("name",$("input[name='name']").val());
  16. //ajax进行特殊处理
  17. $.ajax({
  18. url: 'uploadPhotoFile',
  19. type: 'post',
  20. //这是浏览器默认使用表单的form中的enctype="multipart/form-date",多样化数据提交格式
  21. data: file,
  22. //不处理数据
  23. processData: false,
  24. //不设置内容类型
  25. contentType: false
  26. })
  27. }
  28. </script>

后端:

  1. @RequestMapping(value = "/uploadPhotoFile", method = RequestMethod.POST)
  2. //MultipartFile[]部分用来接收文件,String name部分用来接收文本数据
  3. public void uploadPhotoFile(MultipartFile[] files,String name) {
  4. if (files.length != 0) {
  5. //文件大小
  6. System.out.println(file.getSize());//229185
  7. //获取文件类型
  8. System.out.println(file.getContentType());//image/png
  9. //获取对象类型
  10. System.out.println(file.getResource());//MultipartFile resource [files]
  11. //获取源文件全名
  12. System.out.println(file.getOriginalFilename());//风景 - 副本 .png
  13. //获取从@RequestParam传来的对象名称
  14. System.out.println(file.getName());//files
  15. //判断文件格式
  16. for (MultipartFile f : files) {
  17. System.out.println(f.getContentType());
  18. }
  19. sout(name);
  20. }
  21. }

把MultipartFile放在实体类中也是可以的

Spring官网例子:

  1. class MyForm {
  2. private String name;
  3. private MultipartFile file;
  4. // ...
  5. }
  6. @Controller
  7. public class FileUploadController {
  8. @PostMapping("/form")
  9. public String handleFormUpload(MyForm form, BindingResult errors) {
  10. if (!form.getFile().isEmpty()) {
  11. byte[] bytes = form.getFile().getBytes();
  12. // store the bytes somewhere
  13. return "redirect:uploadSuccess";
  14. }
  15. return "redirect:uploadFailure";
  16. }
  17. }

获取网站的在磁盘中的绝对路径

1、web.xml配置

  1. <!--WebUtil工具类中给属性赋值——>String param = servletContext.getInitParameter("webAppRootKey");-->
  2. <context-param>
  3. //工具类中给定的名称
  4. <param-name>webAppRootKey</param-name>
  5. //自定义名称
  6. <param-value>MyWebUrl</param-value>
  7. </context-param>
  8. <!--给JVM的系统属性set新的值的类-->
  9. <listener>
  10. <listener-class>
  11. org.springframework.web.util.WebAppRootListener
  12. </listener-class>
  13. </listener>

2、在java类中任意地方获取

  1. //在JVM中获取系统变量
  2. System.getProperty("MyWebUrl");

3、原理:

org.springframework.web.util.WebAppRootListener类源码

  1. 1、类初始化
  2. public void contextInitialized(ServletContextEvent event) {
  3. WebUtils.setWebAppRootSystemProperty(event.getServletContext());
  4. }
  5. 2、通过全局作用域对象获取当前网站所在的根目录
  6. public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {
  7. Assert.notNull(servletContext, "ServletContext must not be null");
  8. //获取地址,也可以在controller中手动通过获取全局作用域对象获取
  9. String root = servletContext.getRealPath("/");
  10. if (root == null) {
  11. throw new IllegalStateException("Cannot set web app root system property when WAR file is not expanded");
  12. } else {
  13. String param = servletContext.getInitParameter("webAppRootKey");
  14. String key = param != null ? param : "webapp.root";
  15. //给JVM虚拟机set新的系统变量
  16. String oldValue = System.getProperty(key);
  17. if (oldValue != null && !StringUtils.pathEquals(oldValue, root)) {
  18. throw new IllegalStateException("Web app root system property already set to different value: '" + key + "' = [" + oldValue + "] instead of [" + root + "] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!");
  19. } else {
  20. System.setProperty(key, root);
  21. servletContext.log("Set web app root system property: '" + key + "' = [" + root + "]");
  22. }
  23. }
  24. }
  25. 3

通过MultipartFile,实现文件上传

  1. public boolean saveFiles(MultipartFile[] files) {
  2. for (MultipartFile file : files) {
  3. if (!file.isEmpty()) {
  4. InputStream in;
  5. FileOutputStream out;
  6. try {
  7. String path = System.getProperty("MyWebUrl")+"WEB-INF\\upload\\" + file.getOriginalFilename();
  8. //通过Spring包装好的InputStream,直接获取输入流
  9. in = file.getInputStream();
  10. out = new FileOutputStream(path);
  11. byte[] bytes = new byte[1024 * 1024];
  12. int readCount;
  13. while ((readCount = in.read(bytes)) != -1) {
  14. out.write(bytes, 0, readCount);
  15. }
  16. out.flush();
  17. in.close();
  18. out.close();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }
  24. return true;
  25. }

使用MultipartFile文件配置

1、applicationContext.xml文件配置

maxUploadSize:单个请求的最大上传大小。这意味着所有上传文件的总大小不能超过这个配置的最大值。默认值是无限的(值为-1)。但是我们可以通过maxUploadSize及其value属性来设置它。

maxInMemorySize:小于这个值的文件存储在内存中,否则它们将直接存储在磁盘中。默认值是10 KB(10240字节)。或者你可以通过maxInMemorySize和它的值属性对它进行定制。

  1. <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <property name="defaultEncoding" value="UTF-8"/>
  4. <!-- 指定所上传文件的总大小不能超过1M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
  5. <property name="maxUploadSize" value="1000000"/>
  6. <!--设置100M文件内存储存,当文件大于100M时文件将直接从客户端的硬盘读取,小于100M文件按将放在服务器内存中,让后再用getInputStream读入服务端内存-->
  7. <property name="maxInMemorySize" value="104857600" />
  8. </bean>

2、maven依赖
#>commons-fileupload和commons-io实际上是由apache提供的jar包,Spring将他们的功能封装在MultiPartFile类中了。

  1. <!-- 文件上传的相关CommonsMultipartResolver -->
  2. <dependency>
  3. <groupId>commons-fileupload</groupId>
  4. <artifactId>commons-fileupload</artifactId>
  5. <version>1.2.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>commons-io</groupId>
  9. <artifactId>commons-io</artifactId>
  10. <version>2.0.1</version>
  11. </dependency>