概述场景

文件上传,是程序开发中必须会使用到的一个功能,比如:

  • 添加商品,用户头像,文章封面等需求
  • 富文本编辑(插件文件上传)

文件上传的原理是什么?

我们为什么要实现文件上传,其实就要共享资源,大家都可以看你的在平台上上传的文件;其实就是把用户自己电脑中的文件,通过程序上传到服务器的过程。

总结一下:把用户的文件javaIO流复制到服务器上的过程,称之为文件上传。

用springboot实现文件上传

实现步骤

1.搭建一个springboot项目

2.准备一个页面上传的页面

在resources/templates/upload.html

server:port: 8777spring:freemarker:suffix: .htmlcache: false

3、实现后台的文件上传

定义文件上传的service

package com.ygt.service;import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;/*** @Author ygt* @Date 2022/9/21 18:50* @Version 1.0*/@Service
public class UploadService {/*** MultipartFile 这个对象是springMvc提供的文件上传的接收的类,* 他的底层会去和HttpServletRequest request 中的request.getInputStream()融合* 从而达到文件上传的效果。也就是说:* 文件上传的原理就是:request.getInputStream()* @param multipartFile* @param dir* @return*/public String uploadImg(MultipartFile multipartFile,String dir){//1.指定文件上传的目录File targetFile = new File("D://tmp/" + dir);try {if(!targetFile.exists())targetFile.mkdirs();//2.指定文件上传以后的目录File targetFileName = new File(targetFile,"aaa.png");//3.文件上传到指定的目录multipartFile.transferTo(targetFileName);return "ok";} catch (Exception e) {e.printStackTrace();return "fail";}}
}

定义一个文件上传的controller

package com.ygt.controller;import com.ygt.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;/*** @Author ygt* @Date 2022/9/21 18:49* @Version 1.0*/
@Controller
public class UploadController {@Autowiredprivate UploadService uploadService;/*** 文件上传的具体实现* @param multipartFile* @param request* @return*/@PostMapping("/upload/file")@ResponseBodypublic String upload(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request){if(multipartFile.isEmpty()){return "文件有误!!";}//1:获取用户指定的文件夹。问这个文件夹为什么要从页面上传过来呢?//原因是:做隔离,不同的业务、不同的文件放在不同的目录中String dir = request.getParameter("dir");return uploadService.uploadImg(multipartFile,dir);}
}

定义一个页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件上传</title>
</head>
<body><h1>文件上传</h1><form action="/upload/file" enctype="multipart/form-data" method="post"><input name="dir" value="bbs"><input name="file" type="file"><input type="submit" value="文件上传"></form>
</body>
</html>

点击文件上传,在后台看到如下代码:

springMvc中对文件上传提供了包装对象:MultipartFile 原理如下:

  • 通过MultipartFile 我们可以很清楚的看到,文件已经被服务器接收

  • 但是会产生一个临时目录,这个目录是可以去配置的

  • 文件上传不会直接上传至实际目录,它一定要经过一个临时目录的中转以后,才会上传到真实目录,其作用为:

    • 防止上传出现网络断开,或者用户上传直接刷新或者取消。因为如果用户的网络断开或者取消,就造成大量的垃圾文件
    • 保证真实目录上传的文件一定是有效的
  • 文件上传的大小:可以进行配置的

  • 文件上传的类型:也是可以进行配置的

server:port: 8777spring:freemarker:suffix: .htmlcache: falseservlet:multipart:enabled: true# 单个文件大小 默认1Mmax-file-size: 1MB# 设置总上传文件的数据大小max-request-size: 10MB# 当文件达到多少时进行磁盘写入file-size-threshold: 20MB# 设置临时目录location: D://tmp//tempxxx

4、指定文件上传的目录

  • 配置springboot静态资源存储服务,将上传的文件放入指定的目录中
package com.ygt.service;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;/*** @Author ygt* @Date 2022/9/21 18:50* @Version 1.0*/@Service
public class UploadService {@Value("${file.uploadFolder}")private String uploadFolder;@Value("${file.staticPath}")private String staticPath;/*** MultipartFile 这个对象是springMvc提供的文件上传的接收的类,* 他的底层会去和HttpServletRequest request 中的request.getInputStream()融合* 从而达到文件上传的效果。也就是说:* 文件上传的原理就是:request.getInputStream()* @param multipartFile* @param dir* @return*/public String uploadImg(MultipartFile multipartFile,String dir){try {String realfilename = multipartFile.getOriginalFilename();  //  上传的文件:aaa.jpg//2.截取文件名的后缀String imgSuffix = realfilename.substring(realfilename.lastIndexOf("."));   //  拿到:.jpg//3.生成唯一的文件名,不能用中文命名,统一用英文名命名String newFilename = UUID.randomUUID().toString() + imgSuffix;  //  将aaa.jpg改写成:SDJFSDK3424.jpg//4.日期目录SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");String datePath = dateFormat.format(new Date());    // 日期目录:2022/9/25//5.指定文件上传以后的目录String serverpath = uploadFolder; //这不是tomcat服务目录,别人不认识File targetPath = new File(serverpath+dir,datePath); //生成一个最终目录:D://tmp/avatar/2022/9/25if(!targetPath.exists())targetPath.mkdirs(); //如果目录不存在:D://tmp/avatar/2022/9/25 递归创建//6.指定文件上传以后的服务器的完整的文件名File targetFileName = new File(targetPath,newFilename); //文件上传以后在服务器上最终文件名和目录是:D://tmp/avatar/2022/9/25/SDJFSDK3424.jpg//7.文件上传到指定的目录multipartFile.transferTo(targetFileName); //将用户选择的aaa.jpg上传到D://tmp/avatar/2022/9/25/SDJFSDK3424.jpg// 可访问的路径要返回页面// http://localhost:8777/avatar/2022/9/25/SDJFSDK3424.jpgString filename = dir+"/"+datePath+"/"+newFilename;return staticPath+"/"+filename;} catch (Exception e) {e.printStackTrace();return "fail";}}
}

5、通过http请求服务资源

springboot如何指定任意目录作为我们资源的访问目录?

springboot有一个目录:static这个目录其实就是静态资源目录,这个目录下面的文件是是可以通过http直接访问的。但是程序化一般是打成jar包的,我们没办法把文件写入到static下,所以springboot提供静态资源目录的额外的映射机制,就是静态资源服务映射。就类似于:nginx的静态资源映射。

package com.ygt.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @Author ygt* @Date 2022/9/29 1:04* @Version 1.0*/@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {@Value("${file.staticPatternPath}")private String staticPatternPath;@Value("${file.uploadFolder}")private String uploadFolder;// 这个就是springboot中springMvc让程序开发者去配置文件上传的额外的静态资源服务的配置@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(staticPatternPath).addResourceLocations("file:"+uploadFolder);// 跳转到出文件名前缀需要加上http://localhost:8777/uploadimg/}
}

核心代码分析:

registry.addResourceHandler("访问的路径").addResourceLocations("上传资源的路径");
registry.addResourceHandler("/uploadimg").addResourceLocations("file:D://tmp");

这个时候你把:aaa.png文件上传到了D://tmp下,那么:你可以通过:http:localhost:8777/uploadimg/aaa.png

环境隔离配置:

application-dev.yml

# 本机配置
file:staticPath: http://localhost:8777staticPatternPath: /upimages/**uploadFolder: D:/tmp/

application-prod.yml

# 服务器配置
file:staticPath: https://www.kuangstudy.comstaticPatternPath: /upimages/**uploadFolder: /www/upload/

application.yml激活环境

server:port: 8777spring:freemarker:suffix: .htmlcache: falseprofiles:active: devservlet:multipart:enabled: true# 单个文件大小 默认1Mmax-file-size: 5MB# 设置总上传文件的数据大小max-request-size: 10MB# 当文件达到多少时进行磁盘写入file-size-threshold: 20MB# 设置临时目录location: D://tmp//tempxxx

6、对文件上传的思考和优化和控制

  • 比如文件的格式
  • 比如文件的大小
  • 比如文件的重命名
  • 比如文件的目录分类

以上就是我关于使用阿里云OSS实现文件上传的全部思路了,希望这篇文章能对屏幕前的你有所帮助。

使用阿里云OSS实现文件上传相关推荐

  1. 阿里云 oss服务器文件上传 java

    前天做oss服务器文件上传,之前没了解过,做的过程中遇到许多问题,最终通过查阅相关资料解决了,特分享一下. 首先准备工作 必要的jar 这里注意版本一致,不然就会报很多坑爹的错误.. 如果你断点调试在 ...

  2. 阿里云 oss多文件上传

    平时在做 oss 上传时,通过都是单个文件上传,但是前几天工作时涉及到多个文件的上传,在所有文件都上传完成后才能再做后续的代码执行.于是在原有的oss上传基础上添加for循环去挨个上传. 介绍一下,o ...

  3. SpringBoot 系列教程(九十九):SpringBoot整合阿里云OSS实现文件上传,下载,删除功能

    一.前言 之所以写这篇文章呢? 是因为最近在做文件上传时遇到一个问题,就是我们在以前使用传统Spring+SpringMVC+Mybatis框架开发Web项目的时候,都是将项目打包生成一个War包,然 ...

  4. Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)

    Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器) 主要思路 上传图片的思路有两种: 第一种是上传到应用服务器,再由应用服务器上传到OSS.这种适合上传的文件较小,较为简单, ...

  5. 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决

    文章目录 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 2.解决方案 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 上传的文件,未指定文件访 ...

  6. 使用阿里云OSS实现图片上传案例

    文章目录 前言 一.OSS是什么? 二.使用步骤 1.开通OSS服务 2.创建bucket 3.创建子账户 4.查看帮助文档,编写后端代码 5.layui前端 总结 前言 在正式的开发环境中,类似图片 ...

  7. vue plupload 的使用, 阿里云OSS PHP 安全上传

    1.  首选npm安装plupload 2. 阿里云OSS PHP 安全上传 <template>   <div class="imgUpload">   ...

  8. 阿里云oss简单的上传下载删除(java)

    阿里云oss上传和下载. 配置maven <!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss --> ...

  9. **关于阿里云oss图片批量上传问题解析**

    关于阿里云oss图片批量上传问题解析 背景 最近在项目开发过程中遇到的问题,消耗了比较久的时间,过程曲折,虽然最终达到目的,但是鉴于各种常用的云数据在对象存储方面大同小异,所以记录一下. 理一下思路: ...

最新文章

  1. arm linux 启动之一:汇编启动到start_kernel
  2. phplivechat安卓app下载_PHP在线网页客服系统PHP Live Chat中文版下载
  3. java 静态初始化 调用_java JVM-类加载静态初始化块调用顺序
  4. spring boot 完整集成jsp。(亲测可用)
  5. 边缘计算和网络切片,为何成为5G的“技术网红”
  6. leetcode -- 303. 区域和检索 - 数组不可变
  7. pdf secured_使您的Spring Security @Secured注释更干燥
  8. 【node】-----简单介绍 nodejs
  9. 深入分析.NET应用程序SQL注入【危害】
  10. 原生JS成语接龙小游戏
  11. python播放音乐同步歌词_Python零基础学习代码实践 —— 模拟播放器中的歌词显示...
  12. 打造健康的程序员-饮食篇
  13. create方法 eslint关闭_react create-react-app使用less 及关闭eslint
  14. linux中的dns中的hint,DNS问题
  15. 一次zabbix连接不上mysql数据库的经历
  16. Mac OS系统进不去,重装也不行,只能抹盘安装,如何备份电脑数据资料?
  17. 中式红木装修——独具东风神韵
  18. 群晖Nas通过jellyfin搭建本地影音库详细全过程(四):解析jellyfin视频信息文件NFO
  19. 【2021年新书推荐】Practical IoT Hacking
  20. C语言实现拉格朗日插值法和牛顿插值法

热门文章

  1. XPS15 9500 五个月使用体验
  2. NSACE高级WEB安全专家
  3. HTML5 canvas画布元素 制作 动态花朵动画
  4. 神威太湖之光夺冠Top500,采用国产众核处理器SW26010
  5. centos7.4安装php5.6套件
  6. Hugging Face 每周速递: Space 支持创建模版应用、Hub 搜索功能增强、BioGPT-Large 还有更多...
  7. 计算机怎样在表格中画正字,excel表格里怎样做艺术字-Excel艺术字怎么在文字下面...
  8. 各类云服务器网站云计算平台大全
  9. Ignite简介以及和Coherence、Gemfire、Redis等的比较
  10. golang 通用Contains方法