文件上传

文章目录

  • 文件上传
    • 1、基础上传
    • 2、上传文件限制
    • 3、上传多个文件
    • 4、参考资料

文件上传是Web开发非常重要的操作

结合SpringBoot实现文件上传操作

1、基础上传

SpringBoot采用FileUpload组件实现上传处理,在控制器中可以使用MultipartFile类进行接收。

FileUpload上传 MultipartFile接收

1、建立上传控制器UploadController,利用MultipartFile将上传文件保存在本地磁盘。

一个上传文件的接口,访问接口选择把要上传的文件利用MultipartFile上传保存在本地磁盘中。

@Controller
public class UploadController {//访问http://localhost//upload_pre 显示upload.html页面@GetMapping("/upload_pre")public String uploadPre() { // 通过model可以实现内容的传递return "upload";}//upload@PostMapping("/upload")@ResponseBodypublic Object upload(String name, MultipartFile photo) throws Exception {Map<String, Object> map = new HashMap<String, Object>();if (photo != null) {    // 现在有文件上传//姓名map.put("name-param", name);//文件名map.put("photo-name", photo.getName());//文件类型 content-type: "image/png",map.put("content-type", photo.getContentType());//文件大小map.put("photo-size", photo.getSize());//eg: UUID + . + pngString fileName = UUID.randomUUID() + "."+ photo.getContentType().substring(photo.getContentType().lastIndexOf("/") + 1);    // 创建文件名称//文件路径  位置 + 文件名String filePath = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getServletContext().getRealPath("/") + fileName;//文件路径map.put("photo-path", filePath);File saveFile = new File(filePath);photo.transferTo(saveFile);        // 文件保存return map;} else {return "nothing";}}
}

2、建立src/main/view/templates/upload.html页面

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>文件上传</title><script type="text/javascript" th:src="@{/js/main.js}"></script> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
</head>
<body><form th:action="@{/upload}" method="post" enctype="multipart/form-data">姓名:<input type="text" name="name"/><br/>照片:<input type="file" name="photo"/><br/><input type="submit" value="上传"/></form>
</body>
</html>

执行

upload.html页面表单填入姓名和选择图片点击上传向upload接口传递了姓名(文本)和图片(二进制数据)两个数据信息。控制器接收到此请求信息后,返回JSON格式信息

{photo-size: 23902,
content-type: "image/png",
photo-path: "C:\Windows\Temp\tomcat-docbase.6786357466203986968.80\2a220798-ecbe-4fae-a1c9-485d75d7dfe1.png",
photo-name: "photo",
name-param: "liuawen"
}

2、上传文件限制

在实际项目开发中,需要对用户上传文件的大小进行限制,这样才可以保证服务器的资源不被浪费。 配置yml实现上传限制

1、修改application.yml配置文件,增加上传限制。

application.yml

spring:http:multipart:enabled: true           # 启用http上传max-file-size: 10MB     # 设置支持的单个上传文件的大小限制max-request-size: 20MB  # 设置最大的请求的文件大小,设置总体大小请求file-size-threshold: 512KB   # 当上传文件达到指定配置量的时候会将文件内容写入磁盘location: /             # 设置上传的临时目录

2、对于上传限制,也可以利用Bean实现同样的效果。·

cn.liuawen.config UploadConfig.java

@Configuration
public class UploadConfig {@Beanpublic MultipartConfigElement getMultipartConfig() {MultipartConfigFactory config = new MultipartConfigFactory() ;config.setMaxFileSize("100KB");           // 设置上传文件的单个大小限制config.setMaxRequestSize("20MB");         // 设置总的上传的大小限制config.setLocation("/");                // 设置临时保存目录return config.createMultipartConfig() ;  // 创建一个上传配置}
}

设置上传文件的单个大小限制

为了测试我把上传文件的单个大小限制设置小了点 看测试是否有异常

上传了个195KB的

http://localhost/upload

上传出错后页面执行的效果

错误路径:http://localhost/upload错误信息:Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field photo exceeds its maximum permitted size of 102400 bytes.

错误 图片太大了,用户上传的内容超过了配置的限制,全局异常处理 。

3、上传多个文件

如果要进行多个文件的上传,需要通过MultipartHttpServletRequest进行文件接收。

1、修改upload.html页面,定义多个文件上传控件。

upload.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>SpringBoot多文件上传</title><script type="text/javascript" th:src="@{/js/main.js}"></script> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
</head>
<body><form th:action="@{/upload}" method="post" enctype="multipart/form-data">姓名:<input type="text" name="name"/><br/>
<!--     选择多个文件上传  这里是一个个的呀-->照片1:<input type="file" name="photo"/><br/>照片2:<input type="file" name="photo"/><br/>照片3:<input type="file" name="photo"/><br/><input type="submit" value="上传"/></form>
</body>
</html>

2、修改UploadController控制器,实现多个文件上传。

@Controller
public class UploadController {@GetMapping("/upload_pre")public String uploadPre() { // 通过model可以实现内容的传递return "upload";}@PostMapping("/upload")@ResponseBodypublic Object upload(String name, HttpServletRequest request) {  List<String> result = new ArrayList<String>() ;//多个文件上传  就只是简单的多文件上传保存在本地的磁盘if (request instanceof MultipartHttpServletRequest) {MultipartHttpServletRequest mrequest = (MultipartHttpServletRequest) request;//<input type="file" name="photo"/>List<MultipartFile> files = mrequest.getFiles("photo");Iterator<MultipartFile> iter = files.iterator();while (iter.hasNext()) {MultipartFile photo = iter.next() ;       // 取出每一个上传文件try {result.add(this.saveFile(photo)) ;     // 保存上传信息} catch (Exception e) {e.printStackTrace();}}}return result ; }/*** 文件保存处理* @param file 上传文件* @return 文件保存路径 * @throws Exception 上传异常*/public String saveFile(MultipartFile file) throws Exception {String path = "nothing" ;if (file != null) {                    // 有文件上传if (file.getSize() > 0) {String fileName = UUID.randomUUID() + "."+ file.getContentType().substring(file.getContentType().lastIndexOf("/") + 1); // 创建文件名称path = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getServletContext().getRealPath("/") + fileName;File saveFile = new File(path) ;file.transferTo(saveFile);       // 文件保存}} return path ;}
}

3、测试

http://localhost/upload_pre


http://localhost/upload

[
"C:\Windows\Temp\tomcat-docbase.1489099008397591870.80\c97e9432-4716-4ef8-93d0-d18f3b4ab74d.png",
"C:\Windows\Temp\tomcat-docbase.1489099008397591870.80\09bab86d-44bd-426e-8d5c-9d7c17929ae7.png",
"C:\Windows\Temp\tomcat-docbase.1489099008397591870.80\5d30e2de-f83a-4113-8c96-69b3e92de086.png"
]

为了方便文件上传,就简单在控制器类中定义了一个saveFile()方法,以进行文件的保存,同时利用此方法返回了上传文件的保存路径。

这里的保存上传图片都是保存到本地磁盘的,
假的上传

【SpringBoot】文件上传(基础上传、上传文件限制、上传多个文件)相关推荐

  1. java文件下载时文件类型_Java基础之文件下载实现自定义名称和格式类型-java下载文件...

    response.setContentType()的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据,可以设置文件格式.参考数据如下: re ...

  2. python面试文件操作_python基础-三分钟搞定面试官爱问的【文件操作】

    一.使用python读写文本文件 使用Python来读或者写文本需要用到'open'这个关键字,它的作用是打开一个文件并创建一个文件对象. open语法结构: open(file, mode='r', ...

  3. IOS开发基础之单文件上传基础最原始的方式

    IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...

  4. 【文件上传漏洞11】中间件文件解析漏洞基础知识及实验——Nginx

    目录 1 文件解析漏洞概述 1.1 概述 1.2 Nginx 解析漏洞 1.2.1 空字节解析漏洞 1.2.2 文件名逻辑漏洞 CVE-2013-4547 1.2.3 CGI-PHP 解析漏洞 2 实 ...

  5. 网络安全笔记--文件上传1(文件上传基础、常见后端验证、黑名单、白名单、后端绕过方式)

    1. 基础 1.1 初识文件上传漏洞 文件上传漏洞是一种非常严重的漏洞,如果Web没有对用户上传的文件进行有效地过滤,若有不法分子上传恶意脚本,就有可能获取执行服务端命令的能力,严重影响服务器安全. ...

  6. 文件上传基础及过滤方式

    文件上传基础 uploadlabs 利用思路: 常规类: 扫描获取上传 会员中心上传 后台系统上传 各种途径上传 CMS类: 已知CMS源码 编辑器类: ckeditor fckeditor kind ...

  7. 第20篇:WEB漏洞~文件上传~基础及过滤方式

    目录 Q&A 1. 文件上传漏洞的类型 2. 案例 2.1. 常规文件上传地址的获取说明 2.2. ★不同格式下的文件类型后门测试 2.3. 配合解析漏洞下的文件类型后门测试 2.3. 本地文 ...

  8. 0916文件上传-基础及过滤方式

    文件上传的利用思路 常规类 扫描获取上传 会员中心上传 后台系统上传 各种途径上传 cms类 已知cms源码 编辑器类 编辑器:文件上传的代码可能是自己写的,也可能是直接用编辑器编写的 ckedito ...

  9. WEB漏洞-文件上传基础

    小迪 参考笔记 https://www.bilibili.com/video/BV1JZ4y1c7ro?p=19 https://www.yuque.com/samxara/swro13/tqdn5k ...

  10. egg.js ajax上传文件,egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名...

    一.需求 egg.js 的文件上传个人觉得很一般,内置的 multipart 插件并不怎么好用. egg-multipart 也是基于 co-busboy 实现的. egg 官方给的文件上传的示例地址 ...

最新文章

  1. 在手机网页中使用USEMAP
  2. php access ole相片,[求助]怎样读取ACCESS数据库中的OLE对象的图片啊???
  3. oracle 11g goldengate与oracle 11g数据同步
  4. ASP.NET Core快速入门(第1章:介绍与引入)--学习笔记
  5. SQL语句性能优化操作
  6. jquery动态绑定事件的方法_Jquery绑定事件及动画效果
  7. 使用python简单免费转换视频格式
  8. python爬取设置了权限的qq空间_日常用Python来监控女神QQ空间!就算他把我屏蔽,也阻止不了我!-qq空间怎么设置访问权限...
  9. 【Lintcode】350. Slash Separating
  10. linux进程3种状态,进程的三种状态及转换
  11. 通过TCP网络协议实现控制台多人聊天功能,另附私聊@功能。(java)
  12. android+video+自动播放源码,华为手机浏览器使用Video.js无法自动播放
  13. 计算广告之淘宝oCPC智能出价
  14. [翻译]Billy Belceb 病毒编写教程for Win32
  15. Java整型变量和整型常量
  16. 如何区分项目负责人和项目管理者
  17. 搜索网络中的计算机名,怎样搜索一个局域网里全部机器的名字和IP地址
  18. 民间借贷的法定利息又降低了
  19. Nature Methods期刊的latex模板去哪里找?
  20. HTML-图片热点、网页内嵌、网页拼接、快速切图

热门文章

  1. python爬取拉勾网_Python搭建代理池爬取拉勾网招聘信息
  2. P8195 [传智杯 #4 决赛] 小智的疑惑 —KMP
  3. 2021年低压电工考试及低压电工考试报名
  4. gitter 卸载_最佳Gitter渠道:硬件,物联网和机器人技术
  5. MongoDB的用户管理总结
  6. 关于C语言中的int - float 计算的问题
  7. 2021年化工自动化控制仪表考试题库及化工自动化控制仪表报名考试
  8. EndNote使用教程
  9. endnote使用方法大全,endnote教程
  10. 真心推荐8个高质量Java学习网站,一起从入门到精通java语言,大厂java面试真题分享,建议码住!...