引言

记录一下图片上传本地,并能在浏览器进行访问的方法

配置文件yml

# 开发环境配置
server:# 服务器的HTTP端口,默认为8080port: 8099
spring:# IO文件上传配置servlet:multipart:# 单个文件大小max-file-size:  10MB# 设置总上传的文件大小max-request-size:  20MB
file:uploadPath: E:/temp/res #Linux目录和window目录分隔符是不同的returnPath: /res

配置实体

@Data
@Component
@ConfigurationProperties(prefix = "file")
public class FileConfigProperties {private String uploadPath;private String returnPath;
}

MVC配置类

@Configuration
public class ProjectConfig implements WebMvcConfigurer {@Resourceprivate FileConfigProperties fileConfigProperties;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(fileConfigProperties.getReturnPath() + "/**").addResourceLocations("file:/" + fileConfigProperties.getUploadPath() + "/");}
}

文件上传业务类

controller

@Slf4j
@Controller
@RequestMapping("/file")
public class FileController {@Resourceprivate FileConfigProperties fileConfigProperties;@PostMapping({"/upload"})@ResponseBodypublic R<?> uploadFiles(MultipartFile file) {//上传至指定文件夹String originalFilename = file.getOriginalFilename();//文件新名称String suffix = FileUtil.getSuffix(originalFilename);String newFileName = FileConst.FILE_NAME_PREFIX + LocalDateTimeUtil.format(LocalDateTime.now(), "yyyyMMddHHmmss") + suffix;log.info("重命名文件:===>{}", newFileName);//设置文件存储路径,可以存放在你想要指定的路径里面String filePath =fileConfigProperties.getUploadPath() + File.separator + newFileName;File newFile = new File(filePath);//判断目标文件所在目录是否存在if (!newFile.getParentFile().exists()) {//如果目标文件所在的目录不存在,则创建父目录boolean mkdirs = newFile.getParentFile().mkdirs();}//将内存中的数据写入磁盘try {//使用此方法保存必须要绝对路径且文件夹必须已存在,否则报错file.transferTo(newFile);log.info("文件上传完毕===>{}", newFile.getAbsolutePath());} catch (IOException e) {e.printStackTrace();log.info("文件上传失败");}DKAttachment dkAttachment = new DKAttachment();dkAttachment.setOriginName(originalFilename).setUrl(fileConfigProperties.getReturnPath() + "/" + newFileName);return R.ok(dkAttachment);}/*** 删除** @param name*/@DeleteMapping("/delete/{name}")public R<?> delete(@PathVariable("name") String name) {return R.ok(FileUtil.del(fileConfigProperties.getUploadPath() + File.separator + name));}/*** 删除** @param name*/@GetMapping("/download")public void download(HttpServletRequest request, HttpServletResponse response, String name) {FileUtils.downloadFile(fileConfigProperties.getUploadPath(), name, request, response);}
}/*** 删除** @param name*/@DeleteMapping("/delete/{name}")public void delete(@PathVariable("name") String name) {FileUtil.del(UPLOAD_PATH + File.separator + name);}/*** 删除** @param name*/@GetMapping("/download")public void download(HttpServletRequest request, HttpServletResponse response, String name) {FileUtils.downloadFile(UPLOAD_PATH, name, request, response);}
}

Entity

SQL语句

create table dk_attachment
(id           bigint auto_increment comment '主键id' primary key,business_key varchar(64)                         not null comment '关联业务id',origin_name  varchar(255)                        null comment '原始文件名',url          varchar(255)                        not null comment '访问路径',create_time  timestamp default CURRENT_TIMESTAMP not null comment '创建时间',method       tinyint(1)    default 0                 null comment '文件上传方式(0-本地上传,1-oss,2-minio)',remark       varchar(255)                        null comment '备注'
)comment '附件上传记录表';

实体

业务实体类

@Data
@ApiModel(value = "DKAttachment")
@TableName(value = "dk_attachment")
@Accessors(chain = true)
public class DKAttachment implements Serializable {/*** 主键id*/@TableId(value = "id", type = IdType.AUTO)@ApiModelProperty(value = "主键id")private Long id;/*** business*/@TableField(value = "business_key")@ApiModelProperty(value = "关联业务id")private String businessKey;/*** 访问路径*/@TableField(value = "url")@ApiModelProperty(value = "访问路径")private String url;/*** 原始文件名*/@TableField(value = "origin_name")@ApiModelProperty(value = "原始文件名")private String originName;/*** 创建时间*/@TableField(value = "create_time")@ApiModelProperty(value = "创建时间")private LocalDateTime createTime;/*** 文件上传方式(0-本地上传,1-oss,2-minio)*/@TableField(value = "method")@ApiModelProperty(value = "文件上传方式(0-本地上传,1-oss,2-minio)")private Integer method;/*** 备注*/@TableField(value = "remark")@ApiModelProperty(value = "备注")private String remark;private static final long serialVersionUID = 1L;
}

FileUtils-上传工具类

public class FileUtils {final static Logger log = LoggerFactory.getLogger(FileUtils.class);private FileUtils() {}/*** 下载文件** @param path     文件的位置* @param fileName 自定义下载文件的名称* @param resp     http响应* @param req      http请求*/public static void downloadFile(String path, String fileName, HttpServletRequest req, HttpServletResponse resp) {String charsetCode = String.valueOf(StandardCharsets.UTF_8);try {File file = new File(path + File.separator + fileName);//中文乱码解决String type = req.getHeader("User-Agent").toLowerCase();// 字符编码格式if (type.indexOf("firefox") > 0 || type.indexOf("chrome") > 0) {//谷歌或火狐fileName = new String(fileName.getBytes(charsetCode), "iso8859-1");} else {//IEfileName = URLEncoder.encode(fileName, charsetCode);}// 设置响应的头部信息resp.setHeader("content-disposition", "attachment;filename=" + fileName);// 设置响应内容的类型resp.setContentType(getFileContentType(fileName) + "; charset=" + charsetCode);// 设置响应内容的长度resp.setContentLength((int) file.length());// 输出outStream(new FileInputStream(file), resp.getOutputStream());} catch (Exception e) {log.error("执行文件下载时发生了异常====>{}", e.getMessage());}}/**========================================================*//*** 根据文件名判断响应头部类型*/private static String getFileContentType(String name) {String result = "";String fileType = name.toLowerCase();if (fileType.endsWith(".png")) {result = "image/png";} else if (fileType.endsWith(".gif")) {result = "image/gif";} else if (fileType.endsWith(".jpg") || fileType.endsWith(".jpeg")) {result = "image/jpeg";} else if (fileType.endsWith(".svg")) {result = "image/svg+xml";} else if (fileType.endsWith(".doc")) {result = "application/msword";} else if (fileType.endsWith(".xls")) {result = "application/x-excel";} else if (fileType.endsWith(".zip")) {result = "application/zip";} else if (fileType.endsWith(".pdf")) {result = "application/pdf";} else {result = "application/octet-stream";}return result;}/*** 基础字节数组输出*/private static void outStream(InputStream is, OutputStream os) {try {byte[] buffer = new byte[10240];int length = -1;while ((length = is.read(buffer)) != -1) {os.write(buffer, 0, length);os.flush();}} catch (Exception e) {log.error("执行 outStream 发生了异常===>{}", e.getMessage());} finally {try {os.close();} catch (IOException e) {e.printStackTrace();}try {is.close();} catch (IOException e) {e.printStackTrace();}}}
}

附录:
配置完毕之后就可以通过映射路径加上文件名进行访问预览文件了

SpringBoot 图片上传,预览与下载相关推荐

  1. JavaScript 图片上传预览效果

    图片上传预览是一种在图片上传之前对图片进行本地预览的技术. 使用户选择图片后能立即查看图片,而不需上传服务器,提高用户体验. 但随着浏览器安全性的提高,要实现图片上传预览也越来越困难. 不过群众的智慧 ...

  2. Bootstrap 3 : 图片上传预览 image upload preview

    头部均为: <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css" rel= ...

  3. 模拟QQ心情图片上传预览

    出于安全性能的考虑,目前js端不支持获取本地图片进行预览,正好在做一款类似于QQ心情的发布框,找了不少jquery插件,没几个能满足需求,因此自己使用SWFuplad来实现这个图片上传预览. 先粘上以 ...

  4. html 手机qq图片预览,模拟QQ心情图片上传预览示例

    出于安全性能的考虑,目前js端不支持获取本地图片进行预览,正好在做一款类似于QQ心情的发布框,找了不少jquery插件,没几个能满足需求,因此自己使用SWFuplad来实现这个图片上传预览. 先粘上以 ...

  5. JAVA微信公众号开发第8篇JSSDK图片上传预览

    简介 博主微信JSSDK&图片上传预览基于微信分享做拓展,所以一些配置操作请点击查阅JAVA微信公众号开发第7篇JSSDK&微信分享博文 页面 <html><head ...

  6. 图片上传预览的几种方式,了解下?

    图片上传预览场景基本处处可见,朋友圈发动态配图,身份验证及头像更新,莫过如斯. 原由 最近在研究twitter PC网站的时候,在个人中心的主页,设置个人的背景图的时候,发现twitter有个非常好的 ...

  7. Angular6自定义指令实现多图片上传预览

    在做移动端开发多时候经常会遇到用户图片上传的需求,有单图片上传预览的需求,也有多图片上传预览的需求.自己刚遇到这个需求的时候有踩到各种个样到坑.经过多番尝试,下面将本人成功的一个案例分享出来(公司对外 ...

  8. php 图片上传预览(转)

    网上找的图片上传预览: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  9. js实现图片上传预览及进度条

    js实现图片上传预览及进度条 原文js实现图片上传预览及进度条 最近在做图片上传的时候,由于产品设计的比较fashion,上网找了比较久还没有现成的,因此自己做了一个,实现的功能如下: 1:去除浏览器 ...

  10. JAVA实现一个图片上传预览功能

    这个小项目主要使用java实现了一个简单的图片上传预览功能,废话不多说,先上实现成果 ^ _ ^

最新文章

  1. pandas 字符串数据类型转换成数字型
  2. 【 MATLAB 】使用 MATLAB 实现模拟信号的近似及其连续傅里叶变换
  3. 网站域名解析端口_Linux Nginx网站服务——2
  4. Android中自定义checkbox样式
  5. 1002: A+B for Input-Output Practice (II)
  6. es6的Proxy(代理)
  7. Python-理解装饰器
  8. java中数组的返回值是什么类型_Java数组也是一种数据类型
  9. 华为手机如何固定横屏_华为手机如何录屏?原来方法这么简单,手把手教你学会...
  10. Okio 1.9简单入门
  11. 淮阴工学院计算机系在哪个校区,2021年淮阴工学院有几个校区,大一新生在哪个校区...
  12. linux未找到make命令,linux中无make命令的问题(make: *** 没有指明目标并且找不到 makefile及make命令安装方法)...
  13. Linux Centos firewall 防火墙 开启 80 端口配置案例
  14. 给自己立一个flag
  15. 免费的在线白板协作工具有哪些?
  16. 【名字无关紧要,实战才是唯一】——吾神·娜迦卡布洛斯
  17. QQ传输文件原理参考(来自互联网)
  18. html设置pdf预览名字,浏览器预览PDF文件的个性化设置
  19. uniapp vue3版本 引用color-ui的cu-custom组件问题
  20. uniapp实现瀑布流懒加载实现和无限上拉加载更多

热门文章

  1. *【CodeForces - 768B】Code For 1 (分治策略,模拟二分思想,模拟线段树思想)
  2. 【Unity2D入门教程】简单制作一个弹珠游戏之制作场景③(设置砖块,添加碰撞)
  3. 基于粤嵌6818开发板上通过网络连接实现文件传输
  4. Kafka学习--------消息存储,ISR
  5. 黑盒测试和白盒测试,覆盖率的测试
  6. Web Service技术的SOAP实现
  7. 【案例3-1】(基于控制台的购书系统)
  8. 网站诊断报告之基本分析
  9. VirtualBox-ubuntu系统下挂载U盘
  10. Ubuntu18.04安装GNSS 处理软件 u-center