通过 Nginx 建立自己的图床后,之前的 Picgo 无法使用,导致在文档中插入图片十分不便,本文记录自己搭建 Python 后端服务来为自己的图床适配 Picgo 的方法。
不同的使用者可能有不同的需求,我提供自己的实现思路,供大家参考。
自定义 Web 图床设置
API 地址为服务器地址,后面
/
后可以接一段字符作为输入参数,我将其作为存放文件的子文件夹 post 参数名为文件所在参数名 其余建议不要填,不然会上传失败,不知道原因
from flask import Flask, request
import io
from PIL import Image
import mtutils as mt
import numpy as np
key_para = 'file' # Picgo 映射字段
save_root = 'path-to-your-file' # 数据存储文件夹
host = 'https://1.1.1.1' # flask 监听IP,建议使用 0.0.0.0
default_name = 'imgbed' # 默认二级文件夹名称
log_file_path = '/usr/local/imgbed/log.log' # 日志存放路径
port = '6789' # flask 监听端口
app = Flask(__name__)
app.last_file = None
# 日志对象
app.logger = mt.log_init(log_file_path)
def specific_path(save_to):
# 获取数据包文件
file = request.files[key_para]
file_content = file.read()
# 存放文件的文件夹
save_dir = mt.OS_join(save_root, save_to)
mt.dir_check(save_dir)
# 此处我将非 jpg 图像压缩为 jpg 图保存,其余文件类型直接保存
# check if a jpg Image file
if file.content_type[:5].lower() == 'image' and file.content_type[-4:].lower() not in ['/jpg', 'jpeg']:
# is image
image_obj = Image.open(io.BytesIO(file_content))
# to jpg
file_name = str(mt.Path(file.filename).with_suffix('.jpg'))
save_path = mt.OS_join(save_dir, file_name)
image_save_path = mt.Path(save_path)
image_save_path.parent.mkdir(parents=True, exist_ok=True)
# 保存 jpg 图像
image_obj.save(str(image_save_path))
# 记录日志
app.logger(f'Transfer and save image to {save_path}.')
else:
file_name = file.filename
save_path = mt.OS_join(save_dir, file_name)
obj = open(save_path, mode='wb')
# 保存文件
obj.write(file_content)
# 记录日志
app.logger(f'Save file to {save_path}.')
app.last_file = save_path
back_link = mt.OS_join(host, 'HexoFiles', save_to, file_name)
return back_link
if '__del__' in save_to:
res_str = 'nothing happened.'
if app.last_file is not None:
mt.remove_file(app.last_file)
res_str = f"File deleted {app.last_file}"
app.logger(res_str)
app.last_file = None
return res_str
在 API 链接里
/
后的字符串中如包含__del__
则删除刚刚上传的图像,返回操作结果
@app.route("/", methods=['GET','POST'])
def default_save_path():
default_path = default_name
return specific_path(default_path)
if __name__ == '__main__':
app.logger("**************** Sever Start *******************")
app.run('0.0.0.0', port=port)
pass
from flask import Flask, request
import io
from PIL import Image
import mtutils as mt
import numpy as np
key_para = 'file'
save_root = 'path-to-your-file'
host = 'https://1.1.1.1'
default_name = 'imgbed'
log_file_path = '/usr/local/imgbed/log.log'
port = '6789'
app = Flask(__name__)
app.last_file = None
app.logger = mt.log_init(log_file_path)
@app.route("/<save_to>", methods=['GET','POST'])
def specific_path(save_to):
if '__del__' in save_to:
res_str = 'nothing happened.'
if app.last_file is not None:
mt.remove_file(app.last_file)
res_str = f"File deleted {app.last_file}"
app.logger(res_str)
app.last_file = None
return res_str
file = request.files[key_para]
file_content = file.read()
save_dir = mt.OS_join(save_root, save_to)
mt.dir_check(save_dir)
# check if a jpg Image file
if file.content_type[:5].lower() == 'image' and file.content_type[-4:].lower() not in ['/jpg', 'jpeg']:
# is image
image_obj = Image.open(io.BytesIO(file_content))
# to jpg
file_name = str(mt.Path(file.filename).with_suffix('.jpg'))
save_path = mt.OS_join(save_dir, file_name)
image_save_path = mt.Path(save_path)
image_save_path.parent.mkdir(parents=True, exist_ok=True)
image_obj.save(str(image_save_path))
app.logger(f'Transfer and save image to {save_path}.')
else:
file_name = file.filename
save_path = mt.OS_join(save_dir, file_name)
obj = open(save_path, mode='wb')
obj.write(file_content)
app.logger(f'Save file to {save_path}.')
app.last_file = save_path
back_link = mt.OS_join(host, 'HexoFiles', save_to, file_name)
return back_link
@app.route("/", methods=['GET','POST'])
def default_save_path():
default_path = default_name
return specific_path(default_path)
if __name__ == '__main__':
app.logger("**************** Sever Start *******************")
app.run('0.0.0.0', port=port)
pass
[Unit]
Description = Service for uploading file to target dir
After = network.target
[Service]
ExecStart = path-to-your-python main.py
WorkingDirectory = /usr/local/imgbed/
StandardOutput = inherit
StandardError = inherit
Restart = always
User = lighthouse
[Install]
WantedBy=multi-user.target