本文适用于MAC系统,Typora手写个命令行实现Typora图床效果
2.写个命令行upload-image.sh
#!/bin/bash
result=()
# 传文件
function upload() {
t=$(curl -XPOST -s -F"img=@$1" -H'token:12AC' http://localhost/demo/imgupload/upload.php)
result=(${result[@]} "http://localhost/demo/imgupload/${t}")
}
while [ $# -gt 0 ]; do
upload "$1" $index
shift
done
## //输出格式
echo "Upload Success:"
for i in ${result[*]}; do
echo $i;
done
3.配置本地php环境
准备一个文件 upload.php 在我本地的路劲为 http://localhost/demo/imgupload
<?php
/**
这个文件很单纯,负责上传一张图片,然后返回这个图片的服务器地址
2022-08-12
*/
//创建文件夹
function mkdirs($path)
{
if (!file_exists($path))
{
mkdirs(dirname($path));
mkdir($path, 0777);
}
}
//var_dump($_FILES); // 区别于$_POST、$_GET
$file = $_FILES["img"];
// 先判断有没有错
if ($file["error"] == 0) {
// 成功
// 判断传输的文件是否是图片,类型是否合适
// 获取传输的文件类型
$typeArr = explode("/", $file["type"]);
if($typeArr[0]== "image"){
// 如果是图片类型
$imgType = array("png","jpg","jpeg");
if(in_array($typeArr[1], $imgType)){ // 图片格式是数组中的一个
// 类型检查无误,保存到文件夹内
// 给图片定一个新名字 (使用时间戳,防止重复)
$dir = "upfiles/".date("Y").date("m");
srand ((double) microtime() * 948625);
//生成随机文件名
$targetname =time();
$targetname .= rand();
mkdirs($dir);
$imgname = $dir."/".$targetname.".".$typeArr[1];
// 将上传的文件写入到文件夹中
// 参数1: 图片在服务器缓存的地址
// 参数2: 图片的目的地址(最终保存的位置)
// 最终会有一个布尔返回值
$bol = move_uploaded_file($file["tmp_name"], $imgname);
if($bol){
echo $imgname;
} else {
echo "上传失败!";
};
};
} else {
// 不是图片类型
echo "没有图片,再检查一下吧!";
};
}else{
// 失败
echo $file["error"];
};
?>
为了测试upload.php文件正常工作我写了个html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
Upload Img:<input type="file" name="img"/>
<input type="submit" value="Upload"/>
</form>
</body>
</html>
确认这个接收的php文件是可以正常使用的
upload-image.sh "aa.png" "bb.png" "cc.png"
可以在本地命令行测试下
./upload-image.sh "aa.png"
然后,重启动Typora就可以使用图床了。
测试成功以后把本地的文件打包丢到自己的服务器上,就可以了
毕竟端口放在外面的一个图片上传很危险
upload.php文件前面增加几句token判断
$token = $_SERVER['HTTP_TOKEN'];
if($token!='my123'){
echo "forbidden please contact manager";
exit;
}
upload-image.sh文件访问也修改下
function upload() {
t=$(curl -XPOST -s -F"img=@$1" -H'token:my123' http://localhost/demo/imgupload/upload.php)
result=(${result[@]} "http://localhost/demo/imgupload/${t}")
}
就是把-H'token:' 哪里也设置成本地sh文件相同的密码即可