SpringBoot系列(九)分分钟解决文件上传

往期推荐

SpringBoot系列(一)idea新建Springboot项目

SpringBoot系列(二)入门知识

springBoot系列(三)配置文件详解

SpringBoot系列(四)web静态资源配置详解

SpringBoot系列(五)Mybatis整合完整详细版

SpringBoot系列(六)集成thymeleaf详解版

Springboot系列(七) 集成接口文档swagger,使用,测试

SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式

1.项目搭建与配置

 我们直接创建一个包含web依赖的项目就好了。

然后需要在配置文件配置文件上传的一些设置。这里使用yml文件作为配置文件,如果不懂语法的,请移步前面的系列三,里面有详细解释。

server:
port: 8095 spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 30MB
  • max-file-size 设置能接受的文件最大的大小,记得是MB,或KB
  • max-request-size 设置一次上传的所有文件的大小。

 默认大小为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();
}

 这个方法可以放在启动类里面,也可以自己放置在一个配置类里面,让项目启动的时候能正常加载就行。

2.文件上传

 单文件上传,我们需要用后端接受并将文件存储到项目里面或者是自己定义路径。这里以图片作为上传的文件。并且将文件上传到项目里面。

@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键,然后选中多个文件,就能上传了。

3.总结

 本文讲解了单文件,多文件上传,然后对文件的上传限制条件与访问添加了一些配置。如果你觉得本文对你有用,点个赞表示一下。

SpringBoot系列(九)单,多文件上传的正确姿势的更多相关文章

  1. Struts2文件上传(基于表单的文件上传)

    •Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目   •Commons-Fil ...

  2. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. 分享知识-快乐自己:SpringMvc中的单多文件上传及文件下载

    摘要:SpringMvc中的单多文件上传及文件下载:(以下是核心代码(拿过去直接能用)不谢) <!--设置文件上传需要的jar--> <dependency> <grou ...

  4. SpringBoot --web 应用开发之文件上传

    原文出处: oKong 前言 上一章节,我们讲解了利用模版引擎实现前端页面渲染,从而实现动态网页的功能,同时也提出了兼容jsp项目的解决方案.既然开始讲解web开发了,我们就接着继续往web这个方向继 ...

  5. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...

  6. 传统表单提交文件上传,以及FormData异步ajax上传文件

    传统的文件上传: 只用将form表单的entype修改成multipart/form-data,然后就可以进行文件上传,这种方式常用并且简单. 以下是另一种方式FormData,有时候我们需要ajax ...

  7. 表单多文件上传样式美化 && 支持选中文件后删除相关项

    开发中会经常涉及到文件上传的需求,根据业务不同的需求,有不同的文件上传情况. 有简单的单文件上传,有多文件上传,因浏览器原生的文件上传样式及功能的支持度不算太高,很多时候我们会对样式进行美化,对功能进 ...

  8. springBoot(3)---目录结构,文件上传

    目录结构,文件上传 一.目录结构 1.目录讲解 src/main/java:存放代码      src/main/resources                   static: 存放静态文件, ...

  9. SpringMVC之单/多文件上传

    1.准备jar包(图标所指必备包,其他按情况导入) 2.项目结构 3.SingleController.java(控制器代码单文件和多文件) package com.wt.uplaod; import ...

随机推荐

  1. JUC 中提供的限流利器-Semaphore(信号量)

    在 JUC 包下,有一个 Semaphore 类,翻译成信号量,Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.Semaphore 跟锁 ...

  2. 五、运算符的补充与if语句

    1.可变不可变类型 指:对前面所学类型做一个可变和不可变类型的分类 可变类型:值改变,ID不变,证明改的是原值,原值是可以被改变的 不可变类型:值改变,ID也变了,证明是产生新的值,压根没有改变原值, ...

  3. 模型压缩一半,精度几乎无损,TensorFlow推出半精度浮点量化工具包,还有在线Demo...

    近日,TensorFlow模型优化工具包又添一员大将,训练后的半精度浮点量化(float16 quantization)工具. 有了它,就能在几乎不损失模型精度的情况下,将模型压缩至一半大小,还能改善 ...

  4. pycharm 2.7 快捷键

    提示 CTRL Q: 在参数列表位置,显示可以输入的所有参数 CTRL Q: 查看选中方法的文档字符串 阅读 CTRL -: 折叠当前代码 CTRL +: 展开当前代码 CTRL SHIFT -: 折 ...

  5. iOS 协议分发

    Github:AOMultiproxier.HJProtocolDispatcher 协议实现分发器,能够轻易实现将协议事件分发给多个实现者. 一.AOMultiproxier.h #define A ...

  6. 深入调研Linq to Objects Join Linq to Entity

    最近工作中遇到数据库组合查询带来的一些问题,因此有必要调研一下Linq to Objects Join Linq to Entity.参考一些网友的代码案例,深入实践了一下使用EntityFramew ...

  7. dome 模块 pyaudio 声音处理 为语音识别准备

    dome 模块 pyaudio 声音处理 为语音识别准备 直接上例子 dome1 声音强度检查 import pyaudio import numpy as np class QAudio: CHUN ...

  8. css过渡和2d详解及案例

    css过渡和2d详解及案例(案例在下方,不要着急) 本文重点: 1.在2D变化使用过程中,有些需求需要两种或两种以上的变化同时使用, 值得注意的是尽量把位移变化放在最前面,把其他变化放在最后面,属性值 ...

  9. php源码的编译

    本片文章主要介绍windows下的php源码的编译. 1.1 编译环境 软件 环境 操作系统 Windows 7 专业版 32bit Visual studio 2012 专业版 PHP 5.5.2. ...

  10. 没用过.gitIgnore还敢自称高级开发?

    Git是跟踪项目中所有文件的好工具, 但是,您会希望在项目的整个生命周期中不要跟踪某些文件及其变化. 系统文件(i.e. Mac系统的.Ds_Store) 应用程序配置文件(i.e. app.conf ...