隧道不能访问web vxaln_SpringBoot实现本地存储文件上传及提供HTTP访问服务

笔者计划为大家介绍分布式文件系统,用于存储应用的图片、word、excel、pdf等文件。在开始介绍分布式文件系统之前,为大家介绍一下使用本机存储来存放文件资源。

二者的核心实现过程是一样的:

  • 上传文件,保存文件(本节是本地磁盘)
  • 返回文件HTTP访问服务路径给前端,进行上传之后的效果展示

一、复习

服务端接收上传的目的是提供文件的访问服务,那么对于SpringBoot而言,有哪些可以提供文件访问的静态资源目录呢?

classpath:/META-INF/resources/classpath:/static/classpath:/public/classpath:/resources/

这是之前我们为大家介绍的内容,从这里看出这里的静态资源都在classpath下。那么就出现问题:

  • 应用的文件资源不能和项目代码分开存储(你见过往github上传代码,还附带项目文件数据的么?)
  • 项目打包困难,当上传的文件越来越多,项目的打包jar越来越大。
  • 代码与文件数据不能分开存储,就意味着文件数据的备份将变得复杂

二、文件上传目录自定义配置

怎么解决上述问题?别忘记了spring boot 为我们提供了 使用 spring.resources.static-locations 配置自定义静态文件的位置。

web:  upload-path: D:/data/spring:  resources:    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
web.upload-pathspring.resources.static-locations

三、文件上传的Controller实现

详情看代码注释

@RestControllerpublic class FileUploadController {    //绑定文件上传路径到uploadPath    @Value("${web.upload-path}")    private String uploadPath;     SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");     @PostMapping("/upload")    public String upload(MultipartFile uploadFile,                         HttpServletRequest request) {        // 在 uploadPath 文件夹中通过日期对上传的文件归类保存        // 比如:/2019/06/06/cf13891e-4b95-4000-81eb-b6d70ae44930.png        String format = sdf.format(new Date());        File folder = new File(uploadPath + format);        if (!folder.isDirectory()) {            folder.mkdirs();        }         // 对上传的文件重命名,避免文件重名        String oldName = uploadFile.getOriginalFilename();        String newName = UUID.randomUUID().toString()                + oldName.substring(oldName.lastIndexOf("."), oldName.length());        try {            // 文件保存            uploadFile.transferTo(new File(folder, newName));             // 返回上传文件的访问路径            String filePath = request.getScheme() + "://" + request.getServerName()                    + ":" + request.getServerPort()  + format + newName;            return filePath;        } catch (IOException e) {            throw new CustomException(CustomExceptionType.SYSTEM_ERROR);        }    }}

四、写一个模拟的文件上传页面,进行测试

把该upload.html文件放到classpath:public目录下,对外提供访问。

    Title    

访问测试、点击“选择文件”,之后保存

82ba70d9f2be566113e6f106b2f94887.png

文件被保存到服务端的 web.upload-path 指定的资源目录下

7761b6c0903a8b2a4aa1af85d9787dc2.png

浏览器端响应结果如下,返回一个文件HTTP访问路径:

0b76850e4eab2d00dbe64cdb55b01645.png

使用该HTTP访问路径,在浏览器端访问效果如下。证明我们的文件已经成功上传到服务端,以后需要访问该图片就通过这个HTTP URL就可以了。

bb31fd8e1f2c7ffc42d1fd28b8963ab6.png

欢迎关注微信公众号:慕容千语

来源:https://www.tuicool.com/articles/uq6JVzn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

poj1986 Distance Queries(lca又是一道模版题)

题目链接&#xff1a;http://poj.org/problem?id1986 题意&#xff1a;就是老问题求val[u]val[v]-2*val[root]就行。还有这题没有给出不联通怎么输出那么题目给出的数据一定 是联通的。 题解&#xff1a;就是单纯的lca。 #include <iostream> #include <cstring> …

httpsurlconnection 写不进去authorization值_23. 假设检验的时候为什么常写p lt; 0.05,而不写具体的p值?...

在进行假设检验的时候&#xff0c;如果p值小于设定的临界值&#xff0c;比如0.05或0.01、0.001等&#xff0c;人们常常会写p<0.05、p<0.01、p<0.001, 而没有写具体的p值。这种传统是曾经的技术限制造成的&#xff0c;而在今天是不被提倡的&#xff0c;现代更提倡的是直…

修改form_Vue通过阿里云oss的url连接直接下载文件并修改文件名

我测试过很多遍,想要通过a标签的形式来直接点击url下载文件并重命名但是都失败了,最终只能下载却不能重命名 所以 换了java后台来修改名字.以下代码我做的网页是点击文件直接下载直接下载下来了,一开始的文件名是上传到oss时以id命名的名字,现在下载的时候想改名,遇到了问题,所…

支付宝 报错 rsa_private read error : private key is NULL解决方法

原因: 真机调试IOS支付宝功能GDB出现 rsa_private read error : private key is NULL提示 调试iOS 支付宝SDK的时候&#xff0c;执行demo。把Partner(合作商户 ID)Seller(账户 ID)RSA public key(支付宝公钥)RSA private key(商户私钥)执行的时候&#xff0c;报错 rsa_private…

nasa注册_今天是黑洞星期五!

What is a black hole? A black hole is an astronomical object with a gravitational pull so strong that nothing, not even light, can escape it. A black hole’s “surface,” called its event horizon, defines the boundary where the velocity needed to escape e…

Sort List[leetcode] 由归并排序的递归和循环,到本题的两种解法

归并排序能够有两种思路----top-down 和 bottom-up top-down: 递归实现&#xff0c;将数组分成两半。分别处理。再合并。 伪代码例如以下&#xff1a; split ( A[], l, r) {if ( r - l < 2) return;m (r l) / 2;split ( A, l, m); //split A[l…m-1]split ( A, m, r); //s…

qcap 教程_高通平台抓取ramdump及使用qcap解析,ramdumpqcap

高通平台抓取ramdump及使用qcap解析&#xff0c;ramdumpqcap高通死机或者查找休眠问题可以通过ramdump来分析&#xff0c;具体步骤先确认下内核配置了CONFIG_MSM_DLOAD_MODE&#xff0c;并确认download_mode为1grep -rin CONFIG_MSM_DLOAD_MODE out/target/product/xxxxx/obj/K…

STM32学习笔记(五)——通用定时器计数延时

STM32定时器概述 STM32F40x系列总共最多有14个定时器&#xff0c;定时器分为三类&#xff1a;基本定时器、通用定时器和高级定时器。它们的都是通过计数来达到定时的目的&#xff0c;和51的定时器差不多&#xff0c;基本原理都是一样的&#xff0c;就是功能多了一些&#xff0c…

win10user文件夹迁移_Win10用户文件如何从系统盘转到其他盘

系统盘什么?就是放置Windows系统的硬盘。安装系统放在系统盘里&#xff0c;本身已经占了很大空间&#xff0c;可是用户文件也放在系统盘里。Win10如何把用户文件转移到非系统盘?下面就Win10消费者预览版Build9926为例&#xff0c;与大家分享一下把Win10用户文件移动到非系统盘…

第十九讲:职责链模式

public class CarBodyHandler extends CarHandler{Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车身");}} public abstract class CarHandler {public abstract void HandlerCar(); } public class CarHeadHandle…

十道解分式方程及答案_100道八年级分式方程及答案.

天.一辈子也打不完哪.再问&#xff1a; 50到吧再答&#xff1a; http://zhidao.baidu.com/question/238264424.html 个网址里面有一些&#xff0c;因为有字数限制&#xff0c;我不好发题目给你&#xff0c;所以你自己去看看吧。 例 解方程&#xff1a; (1)2xxx31; (2)15x215 x1…

四阶行列式直接展开_四阶行列式的完全展开式共有多少项

展开全部 共24项。 1.将该行列式前三列重复书写在该行列式的右边,可在前四列中作出两条对角线,然e5a48de588b662616964757a686964616f31333365663463后在此七列中作出相应的平行线,可得(图表一) 2.作乘积关系,可得如下八项: a11a22a33a44,a12a23a34a41,a13a24a31a42,a14a2…

c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...

I.11: 永远不要使用原始指针(T*)或引用(T&)来转移所有权原因如果对调用者或被调用者是否拥有对象有任何疑问&#xff0c;就会发生泄漏或过早析构。示例考虑:X* compute(args) // 不要这样做 { X* res new X{}; // ... return res; }谁来删除返回的X&#xff1f;当compute返…

for-each循环

for-each循环又叫for增强循环&#xff0c;不需要下标就可以顺序的便历整个数组例如 package cn.hsop.fentian;public class Forxunhuan {public static void main(String[] args) {int[] num { 5, 8, 3, 6 };//定义数组int maxnum[0] ;//假设最大值//遍历数组for (int a : num…

mysql8.0.13 32位下载_MySQL8.0下载-MySQL数据库8.0下载 v8.0.11官方版(32位/64位)--pc6下载站...

mysql是一款数据库管理系统&#xff0c;mysql一般网站开发者或者数据库开发者会用到&#xff0c;mysql拥有体积小巧、读取和存储速度快的特点&#xff0c;新版本完全脱了MylSAM存储引擎&#xff0c;改善了扫描性能&#xff0c;同时还重构了sql分析器&#xff0c;赶快下载使用吧…

处理有外键约束的数据

mysql SET FOREIGN_KEY_CHECKS 0; delete from approval_info;delete from approval_manage;delete from site_message;delete from works;delete from works_theme;SET FOREIGN_KEY_CHECKS 1; oracle drop tablename no CONSTRAINT 还有一个本办法就是 一个一个的找到主…

mysql clickhouse_通过mysql操作clickhouse

mysql软件安装至少需要安装一个mysql客户端&#xff0c;即要有mysql这个命令&#xff1b;也可以直接安装一个mysql数据库&#xff0c;不用可以不启动&#xff1b;clickhouse服务端配置mysql端口vim /etc/clickhouse-server/config.xml9004修改服务器端配置&#xff0c;需要重启…

手游产品经理初探(三)产品中的玩家行为

国内做手游的团队非常多都是一大抄&#xff0c;但非常多时候我们都没有抄到核心的东西&#xff0c;所谓的形象神不象就是这样。那么我们来看一个案例&#xff1a;这个界面是big fish做的玩家送礼物的画面。我们知道在社交类的游戏里面这是一个非经常见的功能&#xff0c;但非常…

mysql shell 所有表_删除mysql数据库中所有表的shell脚本

分享一个可以删除mysql中所有表的shell脚本&#xff0c;代码如下&#xff1a;复制代码 代码示例:#!/bin/bash# 删除mysql中所有表# 示例&#xff1a;# Usage: ./script user password dbnane# Usage: ./script user password dbnane server-ip# Usage: ./script user password …

gbdt和xgboost中feature importance的获取

来源于stack overflow,其实就是计算每个特征对于降低特征不纯度的贡献了多少&#xff0c;降低越多的&#xff0c;说明feature越重要 Ill use the sklearn code, as it is generally much cleaner than the R code. Heres the implementation of the feature_importances proper…