代码很常见也很简单,后面会讲到一些注意点:

package com.ilas.testboot.fileUpload;import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;/*** @Author : JCccc* @CreateTime : 2020/3/21* @Description :**/
@Controller
@RequestMapping("/file")
public class FileController {private static final Logger log = LoggerFactory.getLogger(FileController.class);//以下三个配置项都可改为 录入在 配置文件 或者是 数据库参数配置表内private  static String FILE_PATH = "F:\\testboot\\src\\main\\resources\\static\\upload";private  static String IMG_VISIT_PATH ="/upload";private  static String IMG_HOST="localhost:8089";/*** 文件上传** @param file* @return* @throws IOException*/@ResponseBody@PostMapping("upload")public String upload(@RequestParam("myFile") MultipartFile file) {log.info("file name:" + file.getOriginalFilename());log.info("file type:" + file.getContentType());log.info("file size:" + file.getSize());//    设置新的文件名String newFileNamePrefix = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + UUID.randomUUID().toString().replace("-", "");//    获得文件的扩展名String extension = FilenameUtils.getExtension(file.getOriginalFilename());//    获得新的文件名String newFileName = newFileNamePrefix + "." + extension;String FILE_PATH = "F:\\testboot\\src\\main\\resources\\static\\upload";//  FILE_PATH : 文件的保存路径String filePath=FILE_PATH +"/" + newFileName;try {log.info("开始上传文件【{}】...", newFileName);File dest = new File(filePath);file.transferTo(dest);} catch (IOException e) {e.printStackTrace();return "error";}log.info("文件【{}】上传成功...", newFileName);return IMG_HOST+IMG_VISIT_PATH+"/"+newFileName;}/*** 文件下载* @param fileName* @param response* @throws IOException*/@GetMapping("download")public void download(String fileName, HttpServletResponse response) throws IOException {// String fileName = "测试文件上传.txt";response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);byte[] buff = new byte[1024];BufferedInputStream bis = null;OutputStream os = null;try {os = response.getOutputStream();bis = new BufferedInputStream(new FileInputStream(new File(FILE_PATH+ "/"+ fileName)));int i = bis.read(buff);while (i != -1) {os.write(buff, 0, buff.length);os.flush();i = bis.read(buff);}} catch (IOException e) {e.printStackTrace();} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}}}
}

需要注意的:

首先第一个FILE_PATH,在代码里用做是上传的文件保存的路径,对应的是项目结构里:

(可以看到 这是因为在本地,windows环境一个真实的资源路径)

然后是第二个  IMG_VISIT_PATH ,可以看到配置的是一个 /upload  ,

也就是说访问上传的资源对应的路径,因为我本地传的文件也是传到 /static/upload/ 这个文件夹里面,

而springboot默认的静态资源文件读取路径已经帮我们配置了 classpath:/static/  ,所以我只 配置 /upload 即可(这是方便自定义文件夹 img 或者是headImg 等等)。

这个如果是选择读取的静态资源文件是放在本项目里面的,一定要做好检验,确保是能访问到这个路径下的资源。

检验示例,往这个路径里丢个图片,然后重启项目(为什么要重启一会下面会讲到这个坑):

然后在浏览器直接访问这个图片,如果成功,那么静态资源路径读取是没问题的:

ps: 如果你这个资源资源访问不了,那么你可以自己配置一下静态资源访问路径,可以参考我这篇(https://blog.csdn.net/qq_35387940/article/details/102776317),其实该篇文章后面也展示了通过配置类添加设置静态资源访问路径。

第三个 FILE_HOST ,这是静态资源访问的服务器ip地址和端口(域名),因为在本地开的8089端口,所以直接配置成了本地的访问。

ok.按照这个接口我们使用接口调用工具来 测试一下上传接口:

可以看到返回了我们拼接之后能直接用于访问图片的地址:

但是其实按照目前情况直接访问是 访问不了的:

因为服务器对资源文件的保护机制,咱们本地的服务器是不能对外暴露真实的资源路径。

如果没有重启把刚刚上传的资源编译到 target 文件夹里(这是对外暴露的),那么我们就无法访问。

这时候就需要我们采取一些解决方案了:

1.我们上传的路径直接改成 传到 target 文件夹里面 。

这样确实能随时上传随时访问,但是这样会引出一个问题,因为target文件夹里面的东西是跟着编译走的,我们本身项目没有保存图片,如果项目clean重新打包,那么这个target里面的图片就会丢失。   不太好。

2.把文件上传路径 设置成专门的文件存储路径 ,然后配置该路径可访问。  可行 (Linux服务器中这么做简单直接)

3.也就是本文介绍的一种配置资源访问路径隐射的方式, 既然服务器没有对外暴露真实的资源路径,那么我们就从这个根源去解决。我们采取对应的资源路径映射。

我们新建 ResourceConfig.java :

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @Author : JCccc* @CreateTime : 2020/3/21* @Description :**/
@Configuration
public class ResourceConfig implements WebMvcConfigurer {public void addResourceHandlers(ResourceHandlerRegistry registry) {String path = System.getProperty("user.dir") + "\\src\\main\\resources\\static\\upload\\";//配置静态资源访问路径
//        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");registry.addResourceHandler("/upload/**").addResourceLocations("file:"+path);}}

OK,做了这个上传路径的访问真实路径映射后,我们重新启动项目,重新上传图片,直接访问,

问题解决。剩下的下载接口,也顺便演示一下,其实就是把上传文件返回的路径里面的文件名作为参数调用接口即可:

该篇就到此吧。

Springboot 实现 上传、下载 以及解决必须项目重启才能访问资源的问题相关推荐

  1. springboot文件上传下载实战 ——文件上传、下载、在线打开、删除

    springboot文件上传下载实战 文件上传 文件上传核心 UserFileController 文件上传测试 文件下载与在线打开 文件下载.在线打开核心 UserFileController 文件 ...

  2. springboot文件上传下载实战 —— 登录功能、展示所有文件

    springboot文件上传下载实战 创建项目 pom.xml 数据库建表与环境准备 建表SQL 配置文件 application.properties 整体架构 前端页面 登录页面 login.ht ...

  3. SpringBoot文件上传下载以及优化过程 -- 个人笔记

    Java IO/NIO/AIO的知识体系图 博主最开始是用IO实现文件上传下载功能,但发现效率慢,于是使用了NIO 新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的,弥补了原来的 I/O ...

  4. SpringBoot文件上传下载

    第一部分 文件上传 一.新建项目 二.配置maven <?xml version="1.0" encoding="UTF-8"?> <proj ...

  5. 【笑小枫的SpringBoot系列】【十七】SpringBoot文件上传下载

    本文简介

  6. elementui 按钮 表单_前后端分离,文件上传下载(springBoot+vue+elementUI)

    1.介绍 本文主要是介绍前后端分离的上传下载,后端使用的是SpringBoot,持久层用的是mybatis-plus,前端用的Vue,UI用的elementUI,测试了一下,文本,图片,excel,都 ...

  7. 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:宇的季节 cnblogs.com/chenkeyu/p/80 ...

  8. java ftp 下载慢_Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String usern ...

  9. SpringBoot 文件上传、下载、设置大小

    本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...

最新文章

  1. pandas使用pd.MultiIndex.from_product函数和pd.MultiIndex.from_tuples函数创建复合索引dataframe数据实战
  2. 转载 :28 个 Unix/Linux 的命令行神器
  3. join 高性能_内置的数据无法实现高性能
  4. body onload 控制窗口大小 html,HTML5 对各个标签的定义与规定:body的介绍
  5. python什么时候用eval_Python:eval的妙用和滥用
  6. cesium的clock开始,结束,控制速率
  7. mac 用户 文件夹 权限_Mac视频播放软件推荐
  8. 2022年中国CRM行业研究报告
  9. 打印系统开发(42)——静默打印
  10. 万里汇WorldFirst提现人民币实现当天到账!
  11. 2020年COVID-19撤稿门系列:群魔乱舞,水军纷飞
  12. ROSNOTE 发送cmd_vel话题
  13. html 更改元素坐标,利用JS修改元素的位置属性,为什么style.left可行而style.top失效?...
  14. IIS 服务器常见漏洞
  15. Cloud Exchange已上线 Collis的公告
  16. 023货仓选址(绝对值不等式)
  17. Goland 下载 go 包
  18. 迅雷一直提示“正在开始”“正在停止”的解决方案
  19. Android——关于图片移动与放大与缩小详解
  20. python基础知识教学_【松勤教育】Python基础知识

热门文章

  1. catia 圆显示不圆,设置显示
  2. Linux下配置C语言编程环境
  3. Python如何安装pip
  4. 基于质点弹簧系统的布料模拟修改版
  5. 一般线性模型、混合线性模型、广义线性模型
  6. BZOJ 2818: Gcd区间内最大公约数 为素数的对数(欧拉函数的应用)
  7. 什么是SAFe(规模化敏捷框架)1——全景图基础层
  8. 关于CSDN博客待审核的问题
  9. 2022-2028全球与中国语音克隆市场现状及未来发展趋势
  10. 怎么更改计算机开机声音,电脑开机声音,详细教您电脑开机声音怎么更改