基于springboot的文件上传功能的实现
基于springboot的文件上传功能的实现:
前言:本人是刚学习java后端不久,所以通过记录一下平时所学知识,方便日后的复习,如果有出错的地方,还望包含。
1、使用的工具是idea,和springboot,实现的文件上传的功能。
2、前端的简单的页面,就是一个简单的form表单,通过上传按钮触达,通过post的方式,和后端的save接口进行关联。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>单文件上传</title>
</head>
<body>
<form action="/save" method="post" enctype="multipart/form-data"><input type="file" name="file" value="请选择文件"><input type="submit" value="上传">
</form>
</body>
</html>
前端有些简陋,但实现我们文件上传的功能足以。
3、后端需要在utils层中,添加一个UploadFile的工具类。这个工具类是用的网上大佬发的源码,具体在哪获得的,忘了。
package com.newbie.test0506.utils;import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;public class UploadFile {// 绝对路径private static String absolutePath = "";// 上传文件存放位置1229034771758760405private static String uploadDir = "/static/upload/";/*** 单文件上传* @param file 需要上传的文件* @return 文件名*/public static String uploadFile(MultipartFile file) {// 如果路径不存在则创建createDirIfNotExists();// 获取文件后缀名,如果不需要".",可以在最后+1String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));// 更改文件名String headImg = UUID.randomUUID().toString() + suffix;// 设置上传文件路径String uploadFilePath = absolutePath + "userHeadImg/" + headImg;System.out.println("uploadFilePath="+uploadFilePath);//通过CommonsMultipartFile的方法直接写文件try{file.transferTo(new File(uploadFilePath));} catch (IOException e){System.out.println("");}return uploadFilePath;}/*** 多文件上传* @param files 文件集合* @return 上传路径*/public static String uploadFiles(MultipartFile[] files) {// 如果路径不存在则创建createDirIfNotExists();// 为文件再创建一级目录防止重名String uuidPath = files.length + UUID.randomUUID().toString();//absolutePath="F:\\test\\static\\upload";File uploadPath = new File(absolutePath + "goodsImg/" + uuidPath);System.out.println("absolutePath:"+absolutePath);if (!uploadPath.exists()){uploadPath.mkdirs();}int i = 1; // 用于重命名图片名。从1开始for (MultipartFile file : files){//获取文件名 : file.getOriginalFilename(); 获取文件后缀:FilenameUtils.getExtension()//String uploadFileName = i++ + "." + FilenameUtils.getExtension(file.getOriginalFilename());String uploadFileName = i++ + ".jpg";//通过CommonsMultipartFile的方法直接写文件try{System.out.println("uploadPath="+uploadPath);System.out.println("uploadFileName="+uploadFileName);file.transferTo(new File(uploadPath + "/" + uploadFileName));System.out.println("文件上传成功。");} catch (IOException e){System.out.println(""); //由于上传文件总是出错,所以将打印堆栈的报错信息给删除了,不管文件暂存位置的事情。}}return uuidPath;}/*** 创建与springboot打包的jar同级的static的upload文件夹*/public static void createDirIfNotExists() {if (!absolutePath.isEmpty()) return;//获取根目录File path = null;try {path = new File(ResourceUtils.getURL("classpath:").getPath());System.out.println("path="+path);} catch (FileNotFoundException e) {throw new RuntimeException("获取根目录失败,无法创建上传目录!");}if (!path.exists())path = new File("");absolutePath = path + uploadDir;File uploadPath = new File(absolutePath);if(!uploadPath.exists()) {uploadPath.mkdirs();}}}
注释:上面的文件上传功能,是有一个堆栈信息打印的功能的,但是总是报错,系统缓存路径不存在,很烦,于是就将这个打印的 代码删除了,一下子,心情舒服了很多。
3、后端controller层的代码实现
package com.newbie.test0506.controller;import com.newbie.test0506.service.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.UUID;@Controller
public class TestController {@Autowiredprivate UserServiceImpl userService;@RequestMapping("test")public String test(){return "test";}@ResponseBody@RequestMapping("/save")public String saveGoods( @RequestParam("file") MultipartFile file) {userService.saveGoods(file);return "ok";}@RequestMapping("/upload")public String upload(){return "upload";}}
注释:想要引用的小伙伴,可以改一下上面包名,类名啥的,或者直接拷贝需要的部分。
4、后端service层的代码,这一层的代码,主要是调用工具类中的方法,起主要作用的是文件上传的工具类。
package com.newbie.test0506.service;
import com.newbie.test0506.utils.UploadFile;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;@Service
public class UserServiceImpl {public void saveGoods( MultipartFile file) {System.out.println("files="+file);UploadFile.uploadFile(file);}
}
注释:代码中会包括以下打印部分,这些部分,是本菜鸟为了,理解整个上传原理,做的打印,不喜欢的可以删除。
5、如果整个springboot的环境搭建没有问题,就可以达到预想中的输出,整个文件的输出结果是在前端点击提交之后,会自动跳转到一个ok页面,同时在控制台上会打印上传成功。
文件上传的路径:target/classes/static/upload/goodslmg/
如果不是这个路径可能是因为整个项目的运行环境有区别,这个上传的功能在springboot上运行没有问题,在其他的环境下,没有尝试,不过整个上传的原理,都是大同小异的。
总结,除了这个工具类上传之外,还可以使用IO流对文件进行上传和下载,这个工具类,只是对IO流进行一些封装。
基于springboot的文件上传功能的实现相关推荐
- 基于SpringBoot实现文件上传功能(前端使用postman检查request)
这周培训中有一天的作业是使用SpringBoot实现文件上传功能,老师的要求是在他搭好的基础上加上文件上传模块和前端上传的部分,spring工程搭好了,老师写的代码比较多,虽然实现了功能,但是不助于对 ...
- springboot 上传文件_基于SpringBoot的文件上传
在实际的企业开发中,文件上传是最常见的功能之一,SpringBoot集成了SpringMVC常用的功能,当然也包含了文 件上传的功能,实现起来没有太多的区别. 下面我们来讲解一下,使用SpringBo ...
- springboot util 测试类怎么写_SpringBoot入门建站全系列(九)文件上传功能与下载方式...
SpringBoot入门建站全系列(九)文件上传功能与下载方式 Spring对文件上传做了简单的封装,就是用MultipartFile这个对象去接收文件,当然有很多种写法,下面会一一介绍. 文件的下载 ...
- SpringBoot入门建站全系列(九)文件上传功能与下载方式
SpringBoot入门建站全系列(九)文件上传功能与下载方式 Spring对文件上传做了简单的封装,就是用MultipartFile这个对象去接收文件,当然有很多种写法,下面会一一介绍. 文件的下载 ...
- 使用php框架文件上传,Laravel框架文件上传功能实现方法示例
本文实例讲述了Laravel框架文件上传功能实现方法.分享给大家供大家参考,具体如下: 以Laravel 5.2.45 框架为主,进行文件上传功能的实现如下: 实现步骤: (1). 配置文件修改 打开 ...
- SSM开发书评网29:后台二:wangEditor图片上传;(主要内容是【wangEditor图片上传的文档要求】,【Spring MVC整合FileUpload组件,以实现文件上传功能】)
说明: (1)本篇博客内容说明:[在后台系统,我们点击新增按钮后,会弹出新增图书对话框]→[该对话框中,包含一个wangEditor富文本编辑器]→[wangEditor富文本编辑器中,可以包含图片] ...
- 实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现
之前我们已经详细介绍了WinHttp接口如何实现Http的相关功能.本文我将主要讲解如何使用libcurl库去实现相关功能.(转载请指明出于breaksoftware的csdn博客) libcurl在 ...
- 实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现
在<使用WinHttp接口实现HTTP协议Get.Post和文件上传功能>一文中,我已经比较详细地讲解了如何使用WinHttp接口实现各种协议.在最近的代码梳理中,我觉得Post和文件上传 ...
- Spring MVC环境中的文件上传功能实现
在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上 ...
最新文章
- 剑破冰山—Oracle开发艺术 前言
- 闪存技术论坛即将召开 产业链领军企业齐聚谈变革
- Python 卡方检验演算
- python生词本的生词_【Anki小工具】有道生词本转Anki 1.0
- 防止NullPointerException,是程序员的基本修养
- JavaScript中String的slice(),substr(),substring()三者区别
- PHP的rm指令,git rm 命令
- linux上源码安装mysql,Linux中源码包安装MySQL的shell脚本
- java中常用的一些方法
- mysql中文坑爹的东西
- 深度学习之Ubuntu下安装caffe和TensorFlow的cpu版本
- 全网首发:Could NOT find JNI (missing: JAVA_AWT_INCLUDE_PATH) 解决办法
- python新手如何编写一个猜数字小游戏
- JavaScript基础知识总结(1)
- 海南大学考研经验之(考研英语)
- python浏览器复制粘贴到word里(带格式的)
- 金融行业基于 DELL EMC 高端存储的核心系统实践经验分享
- DB2数据库报错SQL1116N
- CDA数据分析师认证与Pearson VUE达成深度合作
- STM32H743使用PA0,PA1作为ADC输入的坑!!