背景

在还不知道图床这个工具之前,写文章都是手动将图片上传到七牛获取外链,十分的麻烦,也曾想过自己去写过一个工具实现,也是懒,一直没有实现,后来看到其他同事用的图床工具才知道早就有人解决了这个问题。最后为什么还要自己实现一个,主要是两个原因

  • 我用的图床工具是ipic,应该是mac中最受欢迎的工具,默认上传到新浪图床,工具没什么问题,但新浪图床会将图片压缩,这点让我很不爽,如果要解锁其他图床需要付费。
  • 稍微想了下,好像自己实现一个不是很难,而且自己有阿里云服务器,完全可以用来当作图片的文件服务器。


本教程虽然不涉及到编码工作(有几行脚本),但还是有点技术含量,你需要满足以下条件:

  • 有一台Linux的远程服务器(不想花钱的可以不用往下看了)
  • 一台支持bash脚本的电脑(windows操作系统的可以不用往下看了)
  • 了解基本Nginx配置
  • 了解基本Linux知识,了解Linux ssh互信如何配置
  • 了解基本Shell脚本知识

实现

实现的思路很简单:

  • 本地PC和远程服务器配置互信
  • 本地通过scp命令上传至远程服务器

需要解决的两个问题

  • 如何不通过代码实现从剪贴板里读取图片并上传到远程服务器
  • 文件名如何重命名

如果要让工具好用,就必须实现能够从剪贴板里复制图片,复制出来的图片上传至远程服务器需要重命名,名称必须是随机字符串。

mac自带两个剪贴板命令pbcopypbpaste,可以实现从剪贴板的读取和写入,但遗憾的是,两个命令都只支持文本不支持图片,在github上找到了一个支持图片的命令pngpaste,通过brew安装即可

brew install pngpaste

重命名可以用openssl命令随机生成一个base64字符串,由于base64存在特殊字符,可以用tr命令简单处理下

本地PC配置

本地找个目录,创建以下脚本

tuchuang.sh

mkdir -p ~/tuchuan/
v_name=<code>openssl rand -base64 24|tr = x|tr / h|tr + e</code>
v_file=~/tuchuan/$v_name.jpg
if [ "$1" = "" ]; then
	pngpaste $v_file
else
	cp -rf $1 $v_file
fi
scp $v_file root@remote_server:/data/resource/images
echo "![](http://yaya:2001/images/$v_name.jpg)"
echo "![](http://yaya:2001/images/$v_name.jpg)"|pbcopy

remote_server是远程服务器的地址,/data/resource/images是远程服务器用来存放图片的路径。

使用方法很简单,通过截图工具将图片放入剪贴板,运行脚本,脚本自动将图片上传至远程服务器,并将地址写入剪贴板,你可以直接ctrl+v取出地址。

为了使用方便,你可以编辑~/.bash_profile自定义一个名称

alias tc='/Users/asan/u01/shell/tuchuang.sh'

这样,你在控制台输入tc命令就可以了。

远程服务器配置

首先你需要安装好Nginx服务器,这里不会介绍如何安装Nginx,在服务器上创建一个目录用来存储图片,如/data/resource/images,然后配置Nginx

location /images {
        root /data/resource/;
    }

这样请求http://remore_server/images就可以请求到图片。

服务器互信配置

本地PC需要和远程服务器配置互信才能实现无密码上传文件。配置互信的教程网上很多,这里简单说下。

将本地PC文件~/.ssh/id_rsa.pub内容拷贝,添加到远程服务器~/.ssh/authorized_keys文件中即可。如果本地没有id_rsa.pub文件就用ssh-key-gen生成一个。如果远程没有~/.ssh/authorized_keys文件,就用touch命令生成一个:

cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
Trackback

no comment untill now

Add your comment now