全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 14922|回复: 67

B2+CF+ShareX,实现无成本图床和便捷上传

  [复制链接]
发表于 2021-2-25 14:34:50 | 显示全部楼层 |阅读模式
本帖最后由 fule 于 2021-2-25 14:52 编辑

准备
1.一个cloudflare账号 https://dash.cloudflare.com/
2.一个B2账号 https://www.backblaze.com/b2/cloud-storage.html
3.windows软件ShareX
步骤
1.注册B2账号,点击进入B2 Cloud Storage,点击Buckets创建一个BUcket,设为public,并上传一个图片,记录下下图要用的域名

2.点击App keys,添加一个新的key,bucket就选你刚创建的那个,记录下你的密钥,之后要在ShareX中用

3.打开cf,cname一下上图要记的域名,小云朵点亮

4.加一条页面缓存规则.

5.创建一个workers,粘贴下列代码,记得b2domain和bucket的值改成自己的
  1. 'use strict';
  2. const b2Domain = 'img.domain.com'; // configure this as per instructions above
  3. const b2Bucket = 'bucket-name'; // configure this as per instructions above
  4. const b2UrlPath = `/file/${b2Bucket}/`;
  5. addEventListener('fetch', event => {
  6.         return event.respondWith(fileReq(event));
  7. });

  8. // define the file extensions we wish to add basic access control headers to
  9. const corsFileTypes = ['png', 'jpg', 'gif', 'jpeg', 'webp'];

  10. // backblaze returns some additional headers that are useful for debugging, but unnecessary in production. We can remove these to save some size
  11. const removeHeaders = [
  12.         'x-bz-content-sha1',
  13.         'x-bz-file-id',
  14.         'x-bz-file-name',
  15.         'x-bz-info-src_last_modified_millis',
  16.         'X-Bz-Upload-Timestamp',
  17.         'Expires'
  18. ];
  19. const expiration = 31536000; // override browser cache for images - 1 year

  20. // define a function we can re-use to fix headers
  21. const fixHeaders = function(url, status, headers){
  22.         let newHdrs = new Headers(headers);
  23.         // add basic cors headers for images
  24.         if(corsFileTypes.includes(url.pathname.split('.').pop())){
  25.                 newHdrs.set('Access-Control-Allow-Origin', '*');
  26.         }
  27.         // override browser cache for files when 200
  28.         if(status === 200){
  29.                 newHdrs.set('Cache-Control', "public, max-age=" + expiration);
  30.         }else{
  31.                 // only cache other things for 5 minutes
  32.                 newHdrs.set('Cache-Control', 'public, max-age=300');
  33.         }
  34.         // set ETag for efficient caching where possible
  35.         const ETag = newHdrs.get('x-bz-content-sha1') || newHdrs.get('x-bz-info-src_last_modified_millis') || newHdrs.get('x-bz-file-id');
  36.         if(ETag){
  37.                 newHdrs.set('ETag', ETag);
  38.         }
  39.         // remove unnecessary headers
  40.         removeHeaders.forEach(header => {
  41.                 newHdrs.delete(header);
  42.         });
  43.         return newHdrs;
  44. };
  45. async function fileReq(event){
  46.         const cache = caches.default; // Cloudflare edge caching
  47.         const url = new URL(event.request.url);
  48.         if(url.host === b2Domain && !url.pathname.startsWith(b2UrlPath)){
  49.                 url.pathname = b2UrlPath + url.pathname;
  50.         }
  51.         let response = await cache.match(url); // try to find match for this request in the edge cache
  52.         if(response){
  53.                 // use cache found on Cloudflare edge. Set X-Worker-Cache header for helpful debug
  54.                 let newHdrs = fixHeaders(url, response.status, response.headers);
  55.                 newHdrs.set('X-Worker-Cache', "true");
  56.                 return new Response(response.body, {
  57.                         status: response.status,
  58.                         statusText: response.statusText,
  59.                         headers: newHdrs
  60.                 });
  61.         }
  62.         // no cache, fetch image, apply Cloudflare lossless compression
  63.         response = await fetch(url, {cf: {polish: "lossless"}});
  64.         let newHdrs = fixHeaders(url, response.status, response.headers);

  65.   if(response.status === 200){

  66.     response = new Response(response.body, {
  67.       status: response.status,
  68.       statusText: response.statusText,
  69.       headers: newHdrs
  70.     });
  71.   }else{
  72.     response = new Response('File not found!', { status: 404 })
  73.   }

  74.         event.waitUntil(cache.put(url, response.clone()));
  75.         return response;
  76. }
复制代码



6.workers里添加路由,使访问你的域名时,先走workers

访问一下你的图片文件
比如说一开始是https://f000.backblazeb2.com/file/backblaze1489498/wallhaven-md2x8m.jpg
现在用https://dlcu.cf/wallhaven-md2x8m.jpg就可以访问了
7.配置ShareX.
这个感觉没啥好说的,主页面--目标--上传目标设置--backblaze b2,填上就行了


结束
这个的好处就是方便了上传,自己在电脑前,截一下图直接上传,或者复制一下直接上传
还有就是可以用自己的域名,再说的话就是数据自己也能找回.

演示
本文中的图片都是演示

大佬们给俺的博客ip+1可好,秋梨膏
发表于 2021-2-25 15:30:48 | 显示全部楼层
前段时间深度研究过 b2 + cf workers,因为我也准备搭建个自用的图床。

其实 cf workers 那段代码完全不需要写那么复杂… 这代码从英文网站到中文站 基本都是复制粘贴,最初写的人估计都没弄懂 cf workers fetch 的缓存策略。

鉴于我一直在 Mac 和 Windows 之间切换使用,这些搭配本地软件的方案我都不喜欢,准备写一个在线版的图床程序,然后在 b2 和 cloudinary 之间犹豫,b2 的上传接口太蛋疼,cloudinary 其实通过 cf workers 也能自定义域名。

最终一直没动工 是因为卡在了没找到喜欢的域名

✅ 支持任意文件上传
✅ 直接从剪切板粘贴上传(对于截图上传很爽)
✅ 无损压缩图片
✅ 密码访问
✅ 在线管理

这是根据自己的需求 计划的功能,各位 mjj 给点鼓励吧,老规矩写出来了开源

点评

看到开源,这才是真正的大佬  发表于 2021-3-17 09:24
加油  发表于 2021-3-2 15:08
支持!  发表于 2021-3-2 11:31
加油加油  发表于 2021-2-25 22:38
那我就等着了,哈哈哈  发表于 2021-2-25 18:37
发表于 2021-2-25 23:52:56 | 显示全部楼层
LIHKG 发表于 2021-2-25 23:33
https://github.com/xiebruce/PicUploader
这个PHP项目支持cloudinary
不过万恶的本地移动劫持了cloudina ...

这个有意思,基本上我的想要的都有了
 楼主| 发表于 2021-2-25 14:55:37 | 显示全部楼层
zxxx 发表于 2021-2-25 14:40
谢谢分享,博客ip+1

谢谢大佬
发表于 2021-2-25 14:36:40 | 显示全部楼层
正头痛没法对接ShareX呢,大佬就发啦!!!!!!!
 楼主| 发表于 2021-2-25 14:39:10 | 显示全部楼层
zxxx 发表于 2021-2-25 14:36
正头痛没法对接ShareX呢,大佬就发啦!!!!!!!

哈哈哈这个用起来还蛮方便的
发表于 2021-2-25 14:40:55 | 显示全部楼层
谢谢分享,博客ip+1
发表于 2021-2-25 14:48:33 | 显示全部楼层
和jsDliver+github比优势大吗
发表于 2021-2-25 14:49:11 | 显示全部楼层
不错不错 等会试试
发表于 2021-2-25 14:50:43 | 显示全部楼层
谢谢大佬,晚上试试
 楼主| 发表于 2021-2-25 14:50:53 | 显示全部楼层
Ftsb 发表于 2021-2-25 14:48
和jsDliver+github比优势大吗

github用picgo的话也挺方便的,主要是GitHub不是专门拿来做存储的,这个是专门做存储的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2025-9-6 02:12 , Processed in 0.068847 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表