使用轻量应用服务器搭建图床(整合Typora、PicGo版)

一、在Nginx配置静态资源映射

我们需要通过Nginx设置一个网站,用来展示我们的图片,因为我们刚刚已经通过宝塔安装Nginx,所以在这再设置一个网站:

image-20241126214438554

我们这里设置的图床网站地址为:/www/wwwroot/elitecode:默认创建的文件没有用可以删掉

image-20241126214516889


二、提供API接口

编写API接口

package cn.luoyan.elitecode.controller;

import cn.hutool.core.date.DateUtil;
import cn.luoyan.elitecode.common.AjaxResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;

/**
 * 文件接口
 */
@RestController
@RequestMapping("/file")
public class ImageUploadController {

    @Value("${file.upload.path}")
    private String uploadPath;
    @Value("${file.upload.subdirectory}")
    private String uploadSubdirectory;

    @Value("${file.access.url}")
    private String accessURL;
    @Value("${file.access.subdirectory}")
    private String accessSubdirectory;

    //上传图片
    @PostMapping("/upload")
    public AjaxResult<String> uploadImg(MultipartFile uploadFile) {
        // 按月份存储,获取存储目录
        String dir = DateUtil.format(new Date(), "yyyy-MM");
        File targetLocation = new File(new File(uploadPath, uploadSubdirectory), dir);
        if (!targetLocation.exists()) {
            targetLocation.mkdirs();
        }
        // 获取上传图片名称
        String originalFilename = uploadFile.getOriginalFilename();
        // 获取文件扩展名
        String extName = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 拼接的图片路径,使用UUID命名避免文件发生覆盖
        String newFileName = UUID.randomUUID().toString() + extName;
        File filePath = new File(targetLocation, newFileName);
        //上传图片
        try {
            uploadFile.transferTo(filePath);
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //返回图片访问url
        return AjaxResult.success(accessURL + "/" + accessSubdirectory + "/" + dir + "/" + newFileName);
    }
}

application.yml

# 文件相关配置
file:
  upload:
    # 文件上传的根路径
    path: /www/wwwroot/elitecode
    # 文件存储的子目录
    subdirectory: cos
  access:
    # 文件访问的基础URL
    url: https://pic.luo-yan.cn
    # 文件访问URL的子路径
    subdirectory: cos

三、配置反向代理

image-20241210133717309


四、测试

这里使用postman测试

image-20241210133436652

点开返回的图像地址,可以发现图片上传成功

image-20241210133512868


五、整合PicGo

插件官网:https://github.com/yuki-xin/picgo-plugin-web-uploader

下载好release后导入PicGo即可

image-20241210133824871

新建自定义Web图床

image-20241210133904447

图床配置

image-20241210134023653


六、整合Typora

在Typora的偏好设置中进行如图设置即可

image-20241210134224246

随便复制一张图片到md文件,可以看见上传成功,并在md文件中成功显示图片

image-20241210134316157


七、踩坑

最开始我的API返回的URL并没有封装成对象,而是直接返回一个字符串

//上传图片
@PostMapping("/upload")
public String uploadImg(MultipartFile uploadFile) {
    ....
    //返回图片访问url
    return accessURL + "/" + accessSubdirectory + "/" + dir + "/" + newFileName;
}

当我在md文件中进行测试时,它所显示的格式如下图,多了一个双引号,导致图片无法正确显示

image-20241210134530491

解决办法:将返回的URL封装成JSON对象,此时Typora即可正确解析格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值