点击上方 好好学java ,选择 星标 公众号

重磅资讯、干货,第一时间送达

今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招!

 个人原创100W+访问量博客:点击前往,查看更多

网上已经一些运行不错的图床了,比如

  1. SM.MS https://sm.ms/

  2. 图壳 https://imgkr.com

  3. 路过图床 https://imgchr.com/

那为什么我们还要自己搭建图床呢?一来是因为码农总是喜欢折腾,二来是有了自己的图床数据自己存储更安全。那么接下来我们就搞起来。下面是演示地址,可以先看一下搭建完成的效果。

https://xiaotuwo.github.io
点击按钮上传图片,完成以后可以复制链接和下载

准备前端环境

  1. 安装 nodejs
    自行去nodejs 官网下载,我们主要是为了使用 npm 工具。

  2. 安装淘宝镜像,如果是在国内,下载镜像很慢,所以使用国内的镜像   。

sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
  1. 安装 vue-cli 工具
    因为我们前端使用的 vue,所以需要安装vue-cli

cnpm install -g @vue/cli
  1. 创建项目

vue create xiaotuwo
  1. 添加 antd 依赖

cnpm install ant-design-vue --save
  1. 启动

cd xiaotuwo
npm run serve
  1. 访问,能够访问 HelloWorld 页面说明我们环境准备成功了。

http://localhost:8080

编写前端代码

到这里我们基础环境就搭建完成了,下面就开始编写前端的代码。我们是以 sm.ms 作为原型进行搭建。如下图我们只编辑他的头部,上传部分和尾部

成品形态如下,把 sm.ms 拖拽上传图片的交互设计改成了点击上传图片,不过如果你想实现拖拽也是非常简单,下面是 antd 的样式,换一个标签即可。
https://www.antdv.com/components/upload-cn/

头部和尾部代码非常简单,我们只讲解上传部分代码。搭建好 vue 框架以后去上面提供的 antd 的网址里面找到 upload 控件,直接点击复制自己喜欢的代码样式,粘贴到 content/index.vue 里面就可以了,然后修改 a-upload 的 action 为自己的服务器地址即可,本地测试就是http://localhost:8887/api/images/upload,下文中也有配套的服务端代码。

vue 的语法就不具体展开了,主要讲解一个地方, handlePreview 方法里面我添加了一个复制链接的逻辑,可以轻松的点击预览的时候复制图片链接,这样方便的把网址放入其他地方进行使用。

his.$message.success('复制图片链接成功');
document.addEventListener("copy", function copyCall(e) {e.preventDefault()e.clipboardData.setData("text/html", file.preview)e.clipboardData.setData("text/plain", file.preview)document.removeEventListener("copy", copyCall)
})

到这里基本的前端的搭建完成了,可以直接查看源码
https://github.com/xiaotuwo/xiaotuwo-client

服务器端环境准备

本文采用的是 US3 进行图床搭建,目前 US3 有 20G 的免费存储和 每个月 20G 的免费流量,对于自用和起步还是足够的。

复制下面的链接到浏览器访问查看 US3 官网,首次进入需要注册
https://urlify.cn/YNNBNn
注册完成以后,进入控制台创建 US3 空间

进入空间以后填写存储名,私有空间和公开空间都可以,我创建的是 xiaotuwo.cn-bj.ufileos.com 留存备用。

在 US3 控制台创建令牌,主要是用来上传,删除图片使用

选择好自己刚才创建的空间,设置年限点击确定即可,记得一定要勾选令牌的权限

点击完成以后获取到公钥私钥,复制备用

编写服务端代码

服务端代码主要分为三个部分
1、接收请求的 Controller
2、上传图片到 US3 的逻辑
3、返回内容处理

1、 编写 Controller
使用 MultipartHttpServletRequest 接收到前端的 file 文件,调用 uCloudProvider 进行上传。

@PostMapping({"/api/files/upload"})@ResponseBodypublic FileDTO upload(HttpServletRequest request) {FileDTO resultFileDTO = new FileDTO();MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;MultipartFile file = multipartRequest.getFile("file");long start = System.currentTimeMillis();try {if (file == null) {resultFileDTO.setStatus("error");}FileDTO fileDTO = uCloudProvider.uploadWithExpired(file.getInputStream(), file.getContentType(), Objects.requireNonNull(file.getOriginalFilename()));log.info("UPLOAD_FILE_EXPIRED|ip:{}|referer:{}|url:{}|cost:{}", getIpAddress(request), request.getHeader("referer"), fileDTO.getUrl(), System.currentTimeMillis() - start);executorService.submit(new UCloudScanner(fileDTO, uCloudProvider, executorService, 1));resultFileDTO.setName(fileDTO.getName());resultFileDTO.setUrl(fileDTO.getUrl());resultFileDTO.setThumbUrl(fileDTO.getUrl());resultFileDTO.setStatus("done");} catch (Exception e) {log.error("UPLOAD_FILE_ERROR", e);resultFileDTO.setStatus("error");}return resultFileDTO;}

2、上传图片到 US3 的逻辑
上传 US3 主要是一些配置文件,我直接使用的 Maven 的 Filter 处理,配置文件在 pom.xml 里面,编译的时候写入 application.properties

<id>dev</id>
<properties><server.port>8887</server.port><ucloud.ufile.public-key>你的公钥</ucloud.ufile.public-key><ucloud.ufile.private-key>你的私钥</ucloud.ufile.private-key><ucloud.ufile.upload-domain-private>你的bucket名字.cn-bj.ufileos.com</ucloud.ufile.upload-domain-private><ucloud.ufile.download-domain-private>你的bucket名字.cn-bj.ufileos.com</ucloud.ufile.download-domain-private><ucloud.uaicensor.publicKey>鉴黄公钥</ucloud.uaicensor.publicKey><ucloud.uaicensor.privateKey>鉴黄私钥</ucloud.uaicensor.privateKey><ucloud.uaicensor.resourceId>鉴黄ID</ucloud.uaicensor.resourceId><ucloud.uaicensor.url>http://api.uai.ucloud.cn/v1/image/scan</ucloud.uaicensor.url>
</properties>
<activation><activeByDefault>true</activeByDefault>
</activation>

我们会发现配置文件里面除了文件的配置还有一套鉴黄的配置,对的这个地方不是本文的重点,但是图床一定要有鉴黄的能力,具体的实现可以参考文章 怒爬某 Hub 资源就为撸了一个鉴黄平台
具体 US3 的逻辑代码也是非常的简单,主要的逻辑就是上传,使用私钥和时间戳生成链接,显示。

public FileDTO upload(InputStream fileStream, String mimeType, String fileName) {String generatedFileName;String[] filePaths = fileName.split("\\.");if (filePaths.length > 1) {generatedFileName = UUID.randomUUID().toString() + "." + filePaths[filePaths.length - 1];} else {throw new ErrorCodeException(ErrorCode.FILE_UPLOAD_FAIL);}long start = System.currentTimeMillis();try {log.debug("UCloudProvider start upload file, filename : {}, time : {}", fileName, new Date());ObjectAuthorization objectAuthorization = new UfileObjectLocalAuthorization(publicKey, privateKey);ObjectConfig config = new ObjectConfig(uploadDomainPrivate);PutObjectResultBean response = UfileClient.object(objectAuthorization, config).putObject(fileStream, mimeType).nameAs(generatedFileName).toBucket(bucketNamePrivate).setOnProgressListener((bytesWritten, contentLength) -> {}).execute();log.debug("UCloudProvider end upload file, filename : {}, time : {}, cost : {}", fileName, new Date(), System.currentTimeMillis() - start);if (response != null && response.getRetCode() == 0) {long start2 = System.currentTimeMillis();log.debug("UCloudProvider start get url, filename : {}, time : {}", fileName, new Date());String url = UfileClient.object(objectAuthorization, new ObjectConfig(downloadDomainPrivate)).getDownloadUrlFromPrivateBucket(generatedFileName, bucketNamePrivate, 24 * 60 * 60).createUrl();log.debug("UCloudProvider end get url, filename : {}, time : {}, cost : {}", fileName, new Date(), System.currentTimeMillis() - start2);FileDTO fileDTO = new FileDTO();fileDTO.setUrl(url.replace("http", "https"));fileDTO.setName(generatedFileName);return fileDTO;} else {log.debug("UCloudProvider end upload file, filename : {}, time : {}, cost : {}", fileName, new Date(), System.currentTimeMillis() - start);log.error("upload error,{}", response);throw new ErrorCodeException(ErrorCode.FILE_UPLOAD_FAIL);}} catch (UfileClientException | UfileServerException e) {log.debug("UCloudProvider end upload file, filename : {}, time : {}, cost : {}", fileName, new Date(), System.currentTimeMillis() - start);log.error("upload error,{}", fileName, e);throw new ErrorCodeException(ErrorCode.FILE_UPLOAD_FAIL);}}

3、 返回内容处理,这里也需要注意一下,为了配合 antd 的 upoad 控件,我们的 dto 如下

@Data
public class FileDTO {private String name;private String status;private String url;private String thumbUrl;
}

服务器端源码访问
https://github.com/xiaotuwo/xiaotuwo-server

到这里就全部结束了,你学会了吗?如果有任何问题,可以到 US3 自己的官方论坛提问 
https://uclub.ucloud.cn/invite/93

推荐文章
  • 硬刚一周,3W字总结,一年的经验告诉你如何准备校招!

  • 今年的校招,Java 好拿 offer 吗?

  • 10月了,该聊聊今年秋招了!

  • 聊聊在腾讯实习快一个月的感受

原创电子书历时整整一年总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及校招的总结,各种高频面试题已经全部进行总结,按照章节复习即可,已经拿到了大厂offer。
原创思维导图扫码或者微信搜 程序员的技术圈子 回复 面试 领取原创电子书和思维导图。

10 分钟使用 Spring Boot + Vue + Antd + US3 搭建自己的图床相关推荐

  1. 10 分钟实现 Spring Boot 发生邮件功能

    来源:yizhiwazi jianshu.com/p/5eb000544dd7 基础知识 什么是SMTP? 什么是IMAP? 什么是POP3? IMAP和POP3协议有什么不同呢? 进阶知识 什么是J ...

  2. 《Spring Boot+Vue全栈开发实战》读书笔记

    写在前面 嗯,回家处理一些事,所以离职了,之前的公司用开源技术封装了一套自己的低代码平台,所以之前学的spring Boot之类的东西都忘了很多,蹭回家的闲暇时间复习下. 笔记整体以 Spring B ...

  3. 基于Spring Boot+vue的民宿预定管理系统的设计与实现

    基于Spring Boot+vue的民宿预定管理系统 研究的背景与意义 随着互联网技术的快速发展,网络时代的到来,网络信息也将会改变当今社会[1].各行各业在日常企业经营管理等方面也在慢慢的向规范化和 ...

  4. Spring Boot+Vue/前后端分离/高并发/秒杀实战课程之spring Security快速搭建oauth2 内存版身份认证

    Springboot快速搭建oauth2 内存版身份认证 环境准备 点击[Create New Project]创建一个新的项目 项目环境配置 配置Thymeleaf 搭建oauth2认证,加入两个依 ...

  5. Spring Boot 9 :详细描述Spring Boot + Vue项目部署过程:Centos为例(重点)

    如何部署Spring Boot + Vue项目:Centos为例 一:项目上线:Centos版 1.ACterminal端: 1.1ssh登录服务器 1.2创建acs新用户(第一次创建) 1.3给用户 ...

  6. Spring Boot+Vue全栈开发实战——花了一个礼拜读懂了这本书

    很幸运能够阅读王松老师的<Spring Boot+Vue全栈开发实战>这本书!之前也看过Spring Boot与Vue的相关知识,自己也会使用了Spring Boot+Vue进行开发项目. ...

  7. 自学前后端分离1 Spring Boot+Vue概述

    一,前后端分离. 前后端分离时将一个应用的前端代码和后端代码分开写,如果不用前后端分离传统的JavaWeb开发中前端使用JSP开发,JSP不是由后端开发者来独立完成的前端--〉html静态页面---- ...

  8. 读书笔记《Spring Boot+Vue全栈开发实战》(下)

    本书将带你全面了解Spring Boot基础与实践,带领读者一步步进入 Spring Boot 的世界. 前言 第九章 Spring Boot缓存 第十章 Spring Boot安全管理 第十一章 S ...

  9. 厉害了!Spring Boot + Vue 开发移动端商城(附源码、文档、视频)!

      Java大联盟 致力于最高效的Java学习 关注 B 站搜索:楠哥教你学Java 获取更多优质视频教程 前言 最近有不少小伙伴留言希望楠哥出一套 Spring Boot + Vue 项目实战教程, ...

最新文章

  1. What???你的GitHub爆款项目,面试官可能问都不问
  2. cn域名注册十元_网站域名查询、域名注册流程详解
  3. 关于wordpress 点击文章查看内容跳转加载失败(404)的解决方法
  4. Commit request failed Commit failed. Ref must be HEAD and is HEAD
  5. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)
  6. myeclipse上进行tomcat远程调试
  7. android Handler的使用(一)
  8. WebStorm 9“神器”变“霸器”
  9. python打开文件注意事项_Python 中关于文件操作的注意事项
  10. http协议报文格式原理图
  11. java 中文乱码的解决方法
  12. 【渝粤教育】国家开放大学2018年春季 0706-22T行政管理学导论 参考试题
  13. oracle数据如何采集,网页采集的数据如何导出到Oracle数据库 - 八爪鱼采集器
  14. 可以通过格式化硬盘清除计算机病毒吗,电脑中毒,完全格式化硬盘可以吗?
  15. Schizophrenia Bulletin: 精神分裂症的潜在临床-结构维度
  16. Windows系统日志文件分析
  17. 如何使用css实现三角形?
  18. 新茶饮、新烘焙的2021:亏损与食安问题未解,元宇宙和第三空间又来凑热闹
  19. java的意思 java语言的优点有什么
  20. python requests是什么_python requests库学习

热门文章

  1. linux设备驱动模型之 kset原理与实例分析
  2. 机器学习 聚类篇——DBSCAN的参数选择及其应用于离群值检测
  3. linux 7 zip软件下载,linux安装使用7zip教程
  4. 删除web文本框中的内容需要或者文本框失去焦点,点击“Backspace”键时页面回退,屏蔽页面回退键的方法
  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)异常类层次
  6. 《研磨设计模式》chap14 迭代器模式(2)算工资举例
  7. 关于sendinput() inserted only 0 out of 2 python程序问题的解决
  8. 01-简述cache的基本概念和使用场景
  9. [mmu/cache]-ARM cache的学习笔记-一篇就够了
  10. [How TO]-virtualbox下安装ubuntu14.04超详细