SpringBoot系列(九)分分钟解决文件上传html
往期推荐
SpringBoot系列(一)idea新建Springboot项目前端
SpringBoot系列(四)web静态资源配置详解spring
SpringBoot系列(五)Mybatis整合完整详细版后端
SpringBoot系列(六)集成thymeleaf详解版跨域
Springboot系列(七) 集成接口文档swagger,使用,测试数组
SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式浏览器
咱们直接建立一个包含web依赖的项目就行了。
而后须要在配置文件配置文件上传的一些设置。这里使用yml文件做为配置文件,若是不懂语法的,请移步前面的系列三,里面有详细解释。app
server: port: 8095 spring: servlet: multipart: max-file-size: 10MB max-request-size: 30MB
默认大小为1MB
除了能够用配置文件配置还可利用java配置,以下
@Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); //上传的单个文件最大值 KB,MB 这里设置为10MB DataSize maxSize = DataSize.ofMegabytes(10); DataSize requestMaxSize = DataSize.ofMegabytes(30); factory.setMaxFileSize(maxSize); /// 设置一次上传文件的总大小 factory.setMaxRequestSize(requestMaxSize); return factory.createMultipartConfig(); }
这个方法能够放在启动类里面,也能够本身放置在一个配置类里面,让项目启动的时候能正常加载就行。
单文件上传,咱们须要用后端接受并将文件存储到项目里面或者是本身定义路径。这里以图片做为上传的文件。而且将文件上传到项目里面。
@RestController @RequestMapping("/file") public class FileController { @PostMapping("/uploadFile") public String uploadFile(MultipartFile file, HttpServletRequest request) { if (file.isEmpty()){ return "上传的文件不能为空!请从新上传"; } if (file.getSize()<=0){ return "上传的文件大小须要大于0kb"; } System.out.println(file.getContentType());//image/png Date date = new Date(); Long time = date.getTime(); String originFileName = file.getOriginalFilename();//获取文件原始的名称 String newFileName = time+originFileName; //获取项目运行的绝对路径 String filePath = System.getProperty("user.dir"); //因为我是建立的多模块项目,因此获取到的项目运行路径为外层的项目路径, // 这时候咱们就须要在项目相对路径这里加上项目的名称demo-upload String newFilePath = filePath+"\\demo-upload\\src\\main\\resources\\static\\images\\"; //固然你也能够本身设置一个绝对路径用于图片上传,文件上传。 //好比说:D:\\images\\ File file1 = new File(newFilePath); if (!file1.exists()){ file1.mkdirs(); } FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(newFilePath+newFileName); fileOutputStream.write(file.getBytes()); fileOutputStream.flush(); fileOutputStream.close(); return "localhost:8095/images/"+newFileName; } catch (java.io.IOException e) { e.printStackTrace(); } return "上传失败"; } }
代码说明:
在代码里,咱们能够利用参数file来判断这个文件是否为空,或者将这个文件的后缀名拿出来,判断这个文件的类型是否符合咱们的要求,利用getContentType() 方法,若是你是上传的png图片,那么打印出来的就是image/png 其余类型的图片就是其余类型。咱们为了区分图片,能够利用当前时间的getTime方法得到的数字来做为图片的前缀,也能够用其余的数字或者字符串。都不想说了,码字太累了。接下来获取当前项目运行的路径,因为我是建立的多模块项目,因此这个获取的路径须要再加上项目名称,后面加上咱们须要上传的文件存储的位置,通常在resources文件下面。而后判断这个存储文件的文件夹是否存在,若是不存在就须要建立一个文件。而后利用字节流,将数据写到文件中,返回可访问的路径。
前端代码,我直接在static目录下面建立了一个upload.html文件,而后咱们在文件里面写入一下内容
<p>单文件上传</p> <form action="/file/uploadFile" method="POST" enctype="multipart/form-data"> 文件:<input type="file" name="file"/> <input type="submit" /> </form>
它的action对应了咱们controller里面访问上传文件的对应的方法的路径,method属性是post,与后端一致。type为file的input框的name属性须要与controller里面的接受对象MultipartFile 一致,若是不一致的话后端没法接受到数据。若是你已经写好后端,而前端后端参数不一致,你能够给后端参数加上一个注解。@RequestParam("file") 这个注解放在MultipartFile的前面,这样即便你的参数名字不是file,也能正确接受到数据。
将文件上传以后,那个返回的路径应该是不能直接访问到图片的,会显示404,咱们需能够添加如下配置。
@Configuration public class ResourceConfigAdapter implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //获取文件的真实路径 String path = System.getProperty("user.dir")+"\\demo-upload\\src\\main\\resources\\static\\images\\"; String os = System.getProperty("os.name"); if (os.toLowerCase().startsWith("win")) { registry.addResourceHandler("/images/**"). addResourceLocations("file:" + path); } } }
这里的java动态配置比利用的yml的配置更灵活,在知道文件要存储的位置的状况下,能够本身在yml文件里面加配置。而后咱们运行项目,以下:
上传一张图片,返回可访问的路径
而后咱们将这个URL复制到浏览器,运行,就能访问图片了。
这是单文件上传,而后可能你须要作多文件上传,很简单,后端作一个循环就好了,而后利用MultipartFile的数组接受文件,对前端作一点修改。
@PostMapping("/uploadFiles") public String uploadFiles(MultipartFile[] files,HttpServletRequest request) { StringBuilder paths = new StringBuilder(); for (MultipartFile file:files) { //中间的代码和上面的同样 try { //这里根据实际状况修改,能够用数组 paths.append("localhost:8095/images/"+newFileName+"\n"); } catch (java.io.IOException e) { e.printStackTrace(); } } return paths.toString(); }
前端稍微修改一下
<p>多文件上传</p> <form action="/file/uploadFiles" method="POST" enctype="multipart/form-data"> 文件:<input type="file" name="files" multiple="multiple"/> <input type="submit"/> </form>
这就完成了多文件的上传,在上传的时候你须要按住Ctrl键,而后选中多个文件,就能上传了。
本文讲解了单文件,多文件上传,而后对文件的上传限制条件与访问添加了一些配置。若是你以为本文对你有用,点个赞表示一下。