我使用据说是Windows下最好用的Markdown编辑器“MarkdownPad2”(个人感觉还是Visual Code+Markdown插件666)写Markdown,在贴图方面遇到一个问题,于是找到了网易云的免费OSS服务,并编写了一个小工具来管理图床(网易云OSS)。

Markdown写文档很爽,这里不多说了;网易云OSS免费服务的介绍去官网看就可以了,https://www.163yun.com

50GB免费存储空间

每月100万次免费GET请求


每月20GB免费下行流量


每月10万次免费PUT请求

这个免费额度还是很大的,业界良心,比七牛云要强多了。

————————————————————————————————————————————————————————————————————————————

分割线,下边说正题

————————————————————————————————————————————————————————————————————————————

上图是我写的小工具的截图,起初我使用QQ截图后,需要:

  1. 保存到磁盘
  2. MarkdownPad上传图片(当然,后来也不能用了)

MarkdownPad使用一国外网站做图床,每个MarkdownPad账户仅能上传有限个数的图片(据说破解版可以无限制上传,可能我用的版本破解的不够彻底吧),因此用了一阵子后再也不能贴图了(其实这个国外网站贴图很慢的)。

于是开始寻觅免费图床,很多图床的免费服务都有限制,比如图片个数、保存时限,更重要的是一些小图床不知道过多久就关门大吉了。

有朋友使用GitHub做图床,我没有试过,我使用了开源中国(OSChina)的码云做图床,但图片存储的是Base64编码,太占地方了。

后来我找到了网易云的OSS服务,免费注册认证过后,按照SDK编写了接口程序(网易云的C#示例代码竟然有错误语法,好粗心。。。)。

有了这个小工具后,我使用QQ截图后,直接在Markdown中Ctrl+V即可,方便多了。

贴个小图,求打赏。

下载链接(百度云盘):https://pan.baidu.com/s/1jKcQl5W 密码:hxad

使用时,配置注册的网易云OSS的endpoint和accessKeyId、accessKeySecret,以及创建的bucket名称。

另外两个参数对应于程序窗体的复选框。

——————————————————————————————————————————————————————————————————

没代码的工具,不应该贴在博客园里,下边附上关键代码

——————————————————————————————————————————————————————————————————

阿里云OSS辅助类,实现阿里云OSS接口,摘抄自阿里云帮助文档。

 using Netease.Cloud.NOS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Eyuan._163Yun.Lib
{
public class YunHelper
{
#region 配置
public static string endpoint = "nos-eastchina1.126.net";
public static string accessKeyId = "";
public static string accessKeySecret = "";
public static NosClient nosClient = null;
//
public static string bucket = "dump";
/// <summary>
/// 初始化 NosClient
/// </summary>
public static void InitClient()
{
//
InitConfig();
//
ClientConfiguration conf = new ClientConfiguration();
// 设置NosClient连接超时时间,单位:毫秒
conf.ConnectionTimeout = ;
// 设置NosClient使用的最大连接数
//conf.MaxConnections(200);
// 设置socket超时时间,单位:毫秒
//conf.SocketTimeout(10000);
// 设置失败请求重试次数
//conf.MaxErrorRetry(2);
//nosClient = new NosClient(endpoint, accessKeyId, accessKeySecret);
if (string.IsNullOrEmpty(endpoint) || string.IsNullOrEmpty(accessKeyId) || string.IsNullOrEmpty(accessKeySecret))
{
return;
}
nosClient = new NosClient(endpoint, accessKeyId, accessKeySecret, conf);
}
private static void InitConfig()
{
endpoint = ConfigHelper.Endpoint;
accessKeyId = System.Configuration.ConfigurationManager.AppSettings["accessKeyId"];
accessKeySecret = System.Configuration.ConfigurationManager.AppSettings["accessKeySecret"];
bucket = ConfigHelper.Bucket;
}
#endregion #region 上传文件
/// <summary>
/// 上传文件
/// </summary>
/// <param name="bucket">桶名</param>
/// <param name="key">对象名</param>
/// <param name="fileToUpload">上传的文件</param>
public static void PutObject(string bucket, string key, string fileToUpload)
{
try
{
nosClient.PutObject(bucket, key, fileToUpload);
Console.WriteLine("Put object:{0} succeeded", key);
}
catch (NosException ex)
{
Console.WriteLine("Failed with HTTPStatus: {0}; \nErrorCode: {1}; \nErrorMessage: {2}; \nRequestID:{3}; \nResource:{4}",
ex.StatusCode, ex.ErrorCode, ex.Message, ex.RequestId, ex.Resource);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
#endregion #region 下载文件
/// <summary>
/// 下载文件
/// </summary>
/// <param name="bucket">桶名</param>
/// <param name="key">对象名</param>
/// <param name="dirToDownload">下载文件存放的目录</param>
public static void GetObject(string bucket, string key, string dirToDownload)
{
try
{
nosClient.GetObject(bucket, key, dirToDownload + "/sample.data");
Console.WriteLine("Get object succeeded");
}
catch (NosException ex)
{
Console.WriteLine("Failed with HTTPStatus: {0}; \nErrorCode: {1}; \nErrorMessage: {2}; \nRequestID:{3}; \nResource:{4}",
ex.StatusCode, ex.ErrorCode, ex.Message, ex.RequestId, ex.Resource);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
#endregion #region 列举桶内文件
/// <summary>
/// 列举桶内文件
/// </summary>
/// <param name="bucket">桶名</param>
public static void ListObjects(string bucket)
{
try
{
var keys = new List<string>();
var listObjectsRequest = new ListObjectsRequest(bucket);
ObjectListing result = nosClient.ListObjects(listObjectsRequest);
foreach (var summary in result.ObjectSummarise)
{
Console.WriteLine(summary.Key);
keys.Add(summary.Key);
} Console.WriteLine("List objects of bucket:{0} succeeded ", bucket);
}
catch (NosException ex)
{
Console.WriteLine("Failed with HTTPStatus: {0}; \nErrorCode: {1}; \nErrorMessage: {2}; \nRequestID:{3}; \nResource:{4}",
ex.StatusCode, ex.ErrorCode, ex.Message, ex.RequestId, ex.Resource);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
#endregion #region 删除单个文件
/// <summary>
/// 删除单个文件
/// </summary>
/// <param name="bucket">桶名</param>
/// <param name="key">对象名</param>
public static void DeleteObject(string bucket, string key)
{
try
{
nosClient.DeleteObject(bucket, key);
Console.WriteLine("Delete object succeeded");
}
catch (NosException ex)
{
Console.WriteLine("Failed with HTTPStatus: {0}; \nErrorCode: {1}; \nErrorMessage: {2}; \nRequestID:{3}; \nResource:{4}",
ex.StatusCode, ex.ErrorCode, ex.Message, ex.RequestId, ex.Resource);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
#endregion }
}

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2ui9qt2awpwkg

网易云免费OSS服务用做Markdown图床或博客图片外链的更多相关文章

  1. PicGo + Gitee +Typora实现markdown图床

    目录 1. PicGo安装 2.Gitee配置 3.配置PicGo 3.Typora的设置 网上有一些很详细的教程,我这里只记录要点,其余部分按以下教程步骤来就行. 1. PicGo安装 国内下载可能 ...

  2. 使用Typora + 阿里云OSS + PicGo 打造自己的图床

    使用Typora + 阿里云OSS + PicGo 打造自己的图床 为什么要打造图床? 让笔记远走高飞 试问以下场景: 我们要把 markdown 笔记放到某博客上,直接进行复制即可.但因你的图片存储 ...

  3. 解决“用PicGo-2.3.0-beta5 + GitHub做博客图床,github仓库图片文件不显示”的问题记录(备忘)

    解决"用PicGo-2.3.0-beta5 + GitHub做博客图床,github仓库图片文件不显示"的问题记录(备忘) 历时几个小时百度,终于靠自己理解解决了GitHub仓库图 ...

  4. 搭建markdown图床-腾讯云COS

    背景介绍 书写markdown笔记时,如何处理图片,实在是有些棘手的问题.每一张图都保存在当前文件夹? 每张图都自己重命名?每次上传到cnblogs博客都需要一张一张拖动?markdown已经非常成功 ...

  5. markdown的图片外链

    markdown的图片用本地的很不方便,今天试用了一下七牛的服务,感觉很好用.推荐一下,免费的服务够用并且比较友好.

  6. 学习jQuery的免费资源:电子书、视频、教程和博客

    jQuery毫无疑问是目前最流行的JavasScript库.排名最前的网站中70%使用了jQuery,并且jQuery也成为了Web开发的标准.如果你想找Web开发方面的工作,了解jQuery会大大的 ...

  7. 使用markdown语法撰写csdn博客

    在CSDN之下写blog无疑是一件非常吃力的事情,对于非常多simple爱好者来讲,能用markdown语法来书写代码是最优雅简洁只是的了.本文主要介绍markdown语法和怎样它来撰写csdn下的b ...

  8. 在Markdown中转载CSDN博客

    1.CSDN博客页面右键,点击[检查] 点击检查后,页面右侧出现html代码,如下图 2.如果需要转载全文,则在html代码下侧点击选中article_content 即可,会在代码框中自动选中art ...

  9. Markdown打造高逼格博客

    这里首先假设读者你已经掌握了Markdown与GitHub的基本用法 如果不会, 请先自行百度或Google, 我目前还没写Markdown与GitHub的教程 看云只是一个推荐, 可以认为协助生成格 ...

随机推荐

  1. Java与算法之(1) - 冒泡排序

    冒泡排序法的原理是,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来. 例如对4 3 6 2 7 1 5这7个数字进行从小到大的排序,从最左侧开始,首先比较4和3 因为是从小到大排序,4和3 ...

  2. deeplearning.ai 人工智能行业大师访谈 Pieter Abbeel 听课笔记

    1. Pieter Abbeel小时候想做一个篮球运动员 - -!上学的时候喜欢数学和物理,上大学之后很自然的学工程.Pieter定义工程问题是"解决实际中应用物理和数学的问题". ...

  3. Effective Java 第三版——24. 优先考虑静态成员类

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  4. js闭包的真正理解

    <高级程序设计>上,这样说:当在函数内部定义了其他函数时候,就创建了闭包.闭包有权访问包含函数内部的所有变量. 这个说的太晦涩了,而且我觉得很容易理解错,闭包就是一个嵌套函数嘛?但是我觉得 ...

  5. Tree Recovery(由先、中序列构建二叉树)

    题目来源: http://poj.org/problem?id=2255 题目描述: Description Little Valentine liked playing with binary tr ...

  6. $.extend()方法和(function($){...})(jQuery)详解

    1.    JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为这两种方法的使用时一样的. ...

  7. linux CentOS部署【minimal 】

    1.为什么选择CentOS不选择其他版本:http://www.cnblogs.com/TeemoHQ/p/6377260.html 2.准备的资源:VMware[官网下载],CentOS镜像 [阿里 ...

  8. 2.移植3.4内核-使内核支持烧写yaffs2

    在上章-制作文件系统,并使内核成功启动jffs2文件系统了 本章便开始使内核支持烧写yaffs2文件系统 1.首先获取yaffs2源码(参考git命令使用详解) cd /work/nfs_root g ...

  9. Python自建logging模块

    本章将介绍Python内建模块:日志模块,更多内容请从参考:Python学习指南 简单使用 最开始,我们用最短的代码体验一下logging的基本功能. import logging logger = ...

  10. 引用类型之数组array最全的详解

    Array类型 今天总结一下array类型. js中的数组是有着非常强大的功能.具有很大的灵活性,有两个方面的特点 1.数组的每一项可以保存任何的数据类型:2.数组大小可以动态的调整:看下面的例子: ...