Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >搭建一个属于自己的图床

搭建一个属于自己的图床

作者头像
神奇的程序员
发布于 2022-04-10 01:42:57
发布于 2022-04-10 01:42:57
85800
代码可运行
举报
运行总次数:0
代码可运行

前言

我们在使用Typora进行创作时,文章中的图片可以选择保存到本地或者上传到第三方服务方的图床。

如果图片保存到本地,当我们需要在互联网和别人分享自己创作的内容时,图片是无法显示的,而第三方图床基本上都是收费的。

本文就将跟大家分享下如何搭建一个属于自己的图床,欢迎各位感兴趣的开发者阅读本文。

环境搭建

在typora的偏好配置中,我们切换到图像一栏,如下所示:

image-20210717193829888

  • 图中序号1位置,可以选择插入图片时的行为,点开后我们选择上传图片选项
  • 图中序号2位置,可以选择上传图片时用哪个图床客户端,点开后我们选择uPic选项

安装图床客户端

进入uPic项目的GitHub主页,在Releases页面下载安装包即可。

image-20210717200041404

下载完成,解压后,将其拖拽到 应用程序 文件夹中。

image-20210717200357604

配置客户端

打开应用程序后,会在菜单栏出现一个图标,点击后在出现的选项中,点击“偏好设置”,如下所示:

在打开的界面中,点击左下角的加号,在弹出的选项中点击自定义,如下图所示:

image-20210717201448420

选择自定义后,会出现如下所示的界面:

image-20210717202944353

上传资源所需配置

我们先来降下前4个标注的作用:

  • 序号1标注为上传服务的接口地址
  • 序号2标注为接口的请求方式
  • 序号3标注,接口解析文件流时的字段名
  • 序号4标注为调用上传接口时所需的其他字段,界面如下所示:

image-20210717203729412

注意:我们需要增加一个Header字段,键名为:Content-Type,值为:multipart/form-data; charset=utf-8;。 如果不添加,你的接口则会报错。 body字段则是你调用上传接口时,所需的其它额外参数。

获取资源所需配置

接下来,我们继续看下其他标注的作用:

  • 标注5的值为上传成功后,接口所返回的文件路径地址。例如返回{path:"/uploads/20199afrj.png"},我们需要取出path的值,这里就需要写["path"],层级深的话则需要继续向数组中追加元素,详情请移步:URL 获取规则
  • 标注6为获取到上传的文件后,需要进行拼接的域名前缀
  • 配置完成后,我们可以点击验证来看下服务是否正常,如果正常你会看到如下所示的提示:

image-20210717212425413

最后,点击标注7的保存,我们的配置就完成了。

上传服务

上传服务可以使用任何一门后端语言来编写,只要遵循文件上传规范即可,由于后端语言我只会Java,本文就以Java+SpringBoot框架为例,写一段示例代码。

控制层

我们先来看下controller层的代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.lk.service.FileUploadService;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
// 允许跨域访问
@CrossOrigin()
@RequestMapping("/uploads")
public class FileUploadController {
    // 注入文件上传服务
    @Resource(name = "FileUploadServiceImpl")
    private FileUploadService fileUploadService;
  
    @PostMapping("/singleFileUploadToPath")
    @ResponseBody
    public Map<String, Object> singleFileUploadToPath(@RequestParam("file") MultipartFile file, @RequestParam("path") String path) throws IOException {
        Map<String, Object> result = new HashMap<>(16);
        // 调用单文件上传接口
        return fileUploadService.singleFileUpload(file, path);
    }
}

上述代码中,我们接受两个参数:

  • file:上传过来的文件流
  • path:上传路径名

接口层

接下来,我们来看下service层的代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.web.multipart.MultipartFile;

// 文件上传接口
public interface FileUploadService {
      Map<String, Object> singleFileUpload(MultipartFile file, String path) throws IOException;
}

实现层

最后,我们来看下serviceimpl层的代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Map;
import com.lk.service.FileUploadService;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.HashMap;
import java.io.File;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.lk.utils.UUIDUtil;
import com.lk.utils.DateUtil;
import com.lk.utils.FileUtil;

@Slf4j
@Service("FileUploadServiceImpl")
public class FileUploadServiceImpl implements FileUploadService {
    // 从配置文件读取文件路径
    @Value("${uploadFilePath}")
    private String fileBaseUrl;
    @Override
    public Map<String, Object> singleFileUpload(MultipartFile file, String path) throws IOException {
        return this.writeFile(file, path);
    }
  
    private Map<String, Object> writeFile(MultipartFile file, String path) throws IOException {
        String fileType = file.getContentType();
        long fileSize = file.getSize();
        log.info("[文件类型] - [{}]", fileType);
        log.info("[文件名称] - [{}]", file.getOriginalFilename());
        log.info("[文件大小] - [{}]", fileSize);
        // 文件名
        String fileName = file.getOriginalFilename();
        assert fileName != null;
        // 生成文件名
        String finalFileName = UUIDUtil.getUUID()+fileName.substring(fileName.lastIndexOf("."));
        // 向客户端推送文件信息
        Map<String, Object> result = new HashMap<>(16);
        if (path.length() != 0) {
            String dayTime = DateUtil.getTimeForDay();
            String writePath = fileBaseUrl + path + "/" + dayTime + "/";
            // 路径不存在时,则创建
            Boolean touchResult  = FileUtil.touchFolder(writePath);
            if (!touchResult) {
                result.put("code", -2);
                result.put("msg", "服务器错误: 路径创建失败");
                log.error("上传路径创建失败" + writePath);
                return result;
            }
            // 则写入指定路径下
            file.transferTo(new File(writePath + finalFileName));
            result.put("path", dayTime + "/" + finalFileName);
        } else {
            // 将文件写入默认路径下
            file.transferTo(new File(fileBaseUrl + finalFileName));
        }
        result.put("code", 0);
        result.put("data", "上传成功");
        result.put("contentType", file.getContentType());
        result.put("fileName", finalFileName);
        result.put("fileSize", file.getSize() + "");
        return result;
    }
}

图床客户端请求头配置

上述代码中所列举的上传服务,出了file字段外,还需要传path字段,那么在图床客户端的配置就如下所示:

image-20210717222238001

实现效果

最后,我们来看下配置完成后的效果,如下所示:

1111.gif

写在最后

至此,文章就分享完毕了。

我是神奇的程序员,一位前端开发工程师。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 神奇的程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用码云(gitee)撸一个免费图床V2.0
第一版已完成,这篇文章是在第一版的基础上进行改造升级了。第一版的详细文章请见>>>https://blog.csdn.net/pyfysf/article/details/103990753
趣学程序-shaofeer
2020/05/18
1.7K0
使用码云(gitee)撸一个免费图床V2.0
图片上传api——chevereto个人图床搭建&后端发送请求
5. 根据要求填写,还有填写相关管理员的信息,填写成功后,再次进入该网址,就直接进入了chevereto图床首页。 6. 进入之后可以登录进入仪盘表对网站进行美化。
不愿意做鱼的小鲸鱼
2022/09/26
4K0
图片上传api——chevereto个人图床搭建&后端发送请求
4FastDFS
第二步:在表单中添加一个textarea控件。是一个富文本编辑器的载体。类似数据源。
周杰伦本人
2023/10/12
1650
我花了3块6,给自己搞了一个在线图床功能
随着社交媒体和图片分享平台的广泛应用,图床(即图片托管服务)成为了开发者和内容创作者不可或缺的一部分。图床允许用户将图片上传到云端存储,并通过 URL 进行访问,减少了用户设备上的存储空间占用,同时提供了高效的图片管理和访问方式。腾讯云的轻量对象存储(COS)为开发者提供了一个简单且高效的图床解决方案,本文将介绍如何使用腾讯云 COS 构建一个完整的在线图床功能。
不惑
2024/11/12
8222
我花了3块6,给自己搞了一个在线图床功能
Nginx 搭建图片服务器
本章内容通过Nginx 和 FTP 搭建图片服务器。在学习本章内容前,请确保您的Linux 系统已经安装了Nginx和Vsftpd。
芋道源码
2019/05/09
6.6K0
Nginx 搭建图片服务器
一起来学SpringBoot | 第十七篇:轻松搞定文件上传
文件上传和下载是 JAVA WEB中常见的一种操作,文件上传主要是 将文件通过IO流传输到服务器的某一个特定的文件夹下;刚开始工作那会一个上传文件常常花费小半天的时间,繁琐的代码量以及 XML配置让我是痛不欲生;值得庆幸的是有了 SpringBoot短短的几句代码就能实现文件上传与本地写入操作....
battcn
2018/08/03
9360
一起来学SpringBoot | 第十七篇:轻松搞定文件上传
基于VSFTPD技术与KindEditor的简单案例
1.创建图片上传的service,service实现类,controller(已实现) 2.下载KindEditor,放到静态资源中,并通过script标签指定(注意核实路径,js指定后需要重启项目)
时间静止不是简史
2020/07/27
1.6K0
基于VSFTPD技术与KindEditor的简单案例
使用wangEditor批量上传并且保证图片顺序
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100784.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/30
1.3K0
SpringBoot实现MultipartFile文件上传
1、SpringBoot采用FileUpload组件实现上传处理,在控制器中可以使用MultipartFile类进行接收。
别先生
2020/11/24
9.3K0
SpringBoot实现MultipartFile文件上传
springboot 上传下载图片
上传多张图片:(此处是用来配合 wangeditor用的. 当然, 稍作修改, 也可以用作他用) import com.fxtcn.gov.faq.util.JSONUtil; import com.google.common.base.Strings; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import
zcqshine
2018/05/11
2.8K0
SpringBoot中如何上传Upload
上传: 根据第3部分的helloworld例子,用那个项目做底子。pom.xml都不用改变。参考项目bootUpload1. static/index.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> index1 <form method="POST" action="/upload" enctype="multipart/form-data"> <input type="file" name="file" /><br/><br/> <input type="submit" value="Submit" /> </form> </body> </html> package com.SpringbootMaven; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import javax.servlet.http.HttpServletResponse; @Controller public class UploadController { private static String UPLOADED_FOLDER = "e://temp//"; @RequestMapping("/upload") public void singleFileUpload(@RequestParam("file") MultipartFile file,HttpServletResponse res) throws IOException { try { byte[] bytes = file.getBytes(); Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename()); Files.write(path, bytes); System.out.println("马克-to-win@马克java社区 successfully"); } catch (IOException e) { e.printStackTrace(); } res.sendRedirect("index.html"); } }
马克java社区
2019/07/27
5520
SpringBoot中如何上传Upload
Spring Boot 整合 FastDFS 客户端
前两篇整体上介绍了通过 Nginx 和 FastDFS 的整合来实现文件服务器。但是,在实际开发中对图片或文件的操作都是通过应用程序来完成的,因此,本篇将介绍 Spring Boot 整合 FastDFS 客户端来实现对图片/文件服务器的访问。
IT技术小咖
2019/06/26
1.1K0
Spring Boot 整合 FastDFS 客户端
Java 单文件、多文件上传 / 实现上传进度条
实现:单文件上传、多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件
Krry
2019/08/13
7.2K0
使用EasyExcel导入用户数据
导入依赖包 ```java compile 'com.alibaba:easyexcel:2.2.6' ``` 代码(依赖于springboot) 提供数据导入接口 ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import java.util.List;
JQ实验室
2022/02/10
1.1K0
excel的导入导出和异常非空 总计等处理;导出多个excel合并导出zip(hutool导出)(详细讲解包括分析等等)
我的建议: 1、时时刻刻想着面向对象,写代码时多想一下,这个功能需要哪些对象来干这件事,怎么干在其次,想明白你需要的对象后就去想流程,最后在去组织代码,尽量从后往前看 2、搞清楚问题,遇到什么问题就去解决什么问题,问问题最怕不知道是啥问题,要不然百度都不知道怎么搜
默 语
2024/11/20
1800
excel的导入导出和异常非空 总计等处理;导出多个excel合并导出zip(hutool导出)(详细讲解包括分析等等)
【Spring Boot】026-文件上传、下载、删除
如果配置了拦截器可能无法直接访问静态文件,需要进行响应的调整(见参考文章),我这里为了方便直接把拦截器注释了!
訾博ZiBo
2025/01/06
1440
【Spring Boot】026-文件上传、下载、删除
开发实例:用Vue和Java实现一个批量上传附件的功能
用户1289394
2023/09/22
5530
开发实例:用Vue和Java实现一个批量上传附件的功能
瑞吉外卖实战项目全攻略——第四天
文件上传,也称为upload,是指将本地图片,视频,音频等文件上传到服务器上,可以供其他用户浏览下载的过程
秋落雨微凉
2022/10/25
5900
瑞吉外卖实战项目全攻略——第四天
SpringBoot 使用 FTP 操作文件
因为在 Linux 上,root 用户是不能登陆 FTP 的。如果你输入的是 root 用户,登陆会失败的。
默存
2023/03/09
3.3K1
SpringBoot 使用 FTP 操作文件
对于FastDFS你必须知道的事(最全,精美版)
客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息。文件索引信息
编程张无忌
2021/01/26
7760
对于FastDFS你必须知道的事(最全,精美版)
推荐阅读
相关推荐
使用码云(gitee)撸一个免费图床V2.0
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验