前段时间用 SM.MS 图床的 API 做了一个评论上传图片的小功能。然而有一天 SM.MS 的主人这样说:
喵喵喵?现在我仍在用的这个接口怎么就没有遇到跨域问题,算是默许吗?后来他又说以后还有通过 oauth2 限制上传的打算。倒是本身也是免费的东西,人家爱怎么做怎么做,我们自然没资格评论;只不过看情况,使用这个接口多半也不是长久之计。
之后大致比较下来,支持 API 上传的图床,国内基本是没有合适的了,国外的话稳定性最高的大概就是 Flickr 和 Imgur;因为 Flickr 有容量限制所以不予考虑。剩下的 Imgur 试了一下现在居然还能裸连!但是呢毕竟是外国的东西,国内访问速度受限不说,指不定哪天也被墙挡了;解决方法倒很简单,Nginx 反代一下就可以了。下面参照 Imgur 的文档写了一个简单的 Ajax 上传示例。
<form id="imgur">
<input type="file" class="imgur" accept="image/*" data-max-size="5000" />
</form>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script>
然后到这里申请一个 Application,在下面填入你的 Client ID:
$("document").ready(function () {
$('input[type=file]').on("change", function () {
var $files = $(this).get(0).files;
var formData = new FormData();
formData.append("image", $files[0]);
if ($files.length) {
// Reject big files
if ($files[0].size > $(this).data("max-size") * 1024) {
console.log("Please select a smaller file");
return false;
}
// Replace {{Your Client ID }} with your own API key
var apiUrl = 'https://api.imgur.com/3/image';
var apiKey = '{{Your Client ID }}';
var settings = {
"async": true,
"crossDomain": true,
"url": apiUrl,
"method": "POST",
"datatype": "json",
"headers": {
"Authorization": "Client-ID " + apiKey
},
"processData": false,
"contentType": false,
"data": formData,
beforeSend: function () {
console.log("上传中...");
},
success: function (res) {
$('body').append('<img src="' + res.data.link + '" />');
},
error: function () {
alert("上传失败");
}
}
$.ajax(settings).done(function (res) {
console.log("Done");
});
}
});
});
前端上传就完成了,下面是 Nginx 反代:
server {
......
# 图片文件镜像
location ^~ /imgur/ {
proxy_pass https://i.imgur.com/;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 取消下面的注释可以启用 Nginx 缓存
#proxy_cache STATIC;
#proxy_cache_key $uri;
#proxy_cache_valid 200 30d;
#proxy_cache_use_stale error timeout invalid_header updating
# http_500 http_502 http_503 http_504;
#add_header X-Nginx-Cache $upstream_cache_status;
}
# API 镜像
location ^~ /imgur-api/ {
# 跨域,注意不要和前面的跨域策略冲突/重复
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers'
'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
proxy_pass https://api.imgur.com/;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
......
}
之后就可以通过 https://your.domain/imgur/koe07fX.jpg
访问原 URL 为 https://i.imgur.com/koe07fX.jpg
的图片了;最后把 Ajax 上传脚本里的 apiUrl
换成 https://your.domain/imgur-api/3/image
就可以通过镜像上传了。
暂时不清楚 Imgur 是否对单个 IP 有上传和下载限制,所以为了避免自己的镜像被滥用,建议限制一下 Referer
:
map $http_referer $allow_referer {
default 0;
"" 1;
"~2heng.xin" 1;
"~\.google\." 1;
"~\.baidu\." 1;
}
map $allow_referer $disallow_referer {
0 1;
1 "";
}
server {
......
location balabala {
......
if ( $http_referer = "") { return 403; }
if ( $disallow_referer ) { return 403; }
......
}
......
}
成品示例:https://api.mashiro.top/imgur.html;不过博客上的上传接口暂时懒得修改了,等 SM.MS 哪天彻底完蛋了再换吧。
「樱花庄的白猫」原创文章:《JavaScript + imgur API 上传图片》,转载请保留出处!https://2heng.xin/2018/06/06/javascript-upload-images-with-imgur-api/
Q.E.D.
Comments | 39 条评论
博主 Jsuse
这功能可以耶!我有空也整一个。
(°∀°)ノ
博主 啊啊
使用博主的方法测试了一下,发了几张图片成功率,但是 我去官网登陆自己的账号却没有这些图片。 这些图片不是发到自己的账号上去的吗? 都不知道发到哪里去了,不受自己控制 那么上传的图片自己想删除都删除不了啦
博主 Mashiro
@啊啊 可以看文档,上传图片的时候会返回一个deletehash,之后可以通过这个hash删除图片
https://apidocs.imgur.com/#949d6cb0-5e55-45f7-8853-8c44a108399c
博主 阿萨
这个js上传 的代码需要怎么修改一下 做到批量上传并显示图片出来呢呢,这个每次点击上传一张,太麻烦咯
博主 Mashiro
@阿萨 加个循环就可以了吧
博主 头条新闻
文章不错非常喜欢,支持
博主 红五
学的是php
博主 初夏
腾讯啊。新浪啊。百度啊。怎么不用这几个的接口
https://img.teqiyi.com/
我集成了一下, 可以看看
博主 12554423
@初夏 请问一下你的QQ接口在哪上传的呢
博主 33
6666
博主 hujimiya
博主 猫°
代码高亮不错哦 是插件吗? 求分享
博主 于长野
哇,图片评论这个功能在博客上面很少见哎
博主 MarshiroHellscythe
忘记密码点链接重置密码出了问题
博主 2819026529
hhhh我觉得哦可
博主 云武
该评论为私密评论
博主 LELE
你的代码高亮 用的什么 很好看 想要一份可以吗?
博主 Rinvay
稳得一批,我就想知道你自己图床有木有现成的api我也用的这个图床,搞出来上传api只能每次都手动上传,需要学习!
博主 Mashiro
@Rinvay 你说chevereto吗?有API的,不过它的文档我没看懂
博主 Rinvay
@Mashiro 我看到了API,但是我不知道怎么接入,看不懂!
博主 Spirit
@Rinvay 你好,我找到了一种解决方法,可以看看参考参考鸭WordPress编辑器中添加”上传到Chevereto图床”按钮
博主 人
该评论为私密评论