在写winform的时候发现pictureBox加载网络图片好慢,一开始以为是我买的服务器带宽低的原因,写完这个之后发现是图片大小原因,并且服务器传出的比sm.ms还要快一点点。10k左右的图片大概不会有闪烁,100k以上就会有延迟显示的问题了。
SM.MS图床
sm.ms图床是一个免费的图片服务器,免费申请账号即可拥有5G的空间,其他的就不介绍了,官网链接:https://sm.ms/
1.首先注册一个账号,并登录。
2.进入SM.MS的管理界面:https://sm.ms/home,找到token
代码部分
1.SM.MS的api文档https://doc.sm.ms/
新建两个类用于接收返回值
public class SmMsResponseDto
{
public bool Success { get; set; }
public string Code { get; set; }
public string Message { get; set; }
public SmMsResponseData Data { get; set; }
public string RequestId { get; set; }
}
public class SmMsResponseData
{
public string FileName { get; set; }
public string StoreName { get; set; }
/// <summary>
/// 文件路径
/// </summary>
public string Path { get; set; }
/// <summary>
/// 删除图片用的hash值
/// </summary>
public string Hash { get; set; }
/// <summary>
/// 图片地址
/// </summary>
public string Url { get; set; }
/// <summary>
/// 删除图片的url
/// </summary>
public string Delete { get; set; }
public string Page { get; set; }
}
2.winform代码,放一个button和一个openFileDialog、一个pictureBox
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public string SMMSServerUrl = "https://sm.ms/api/v2/upload";
HttpClient client = new HttpClient();
private async void button1_Click(object sender, EventArgs e)
{
DialogResult dialogResult = openFilePic.ShowDialog();
if (dialogResult == DialogResult.OK)
{
// 获得文件名(包括名字后后缀)
string fileName = openFilePic.SafeFileName;
using (Stream stream = openFilePic.OpenFile())
{
#region 读取流到字节数组
byte[] bytes = new byte[stream.Length];
stream.Position = 0;
stream.Read(bytes, 0, (int)stream.Length);
stream.Close();
#endregion
// 设置token
client.DefaultRequestHeaders.Add("Authorization", "放自己的token");
MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent();
multipartFormDataContent.Add(new ByteArrayContent(bytes), "\"smfile\"", $"\"{fileName}\"");
var response =
await client.PostAsync(SMMSServerUrl, multipartFormDataContent);
var resultStr = await response.Content.ReadAsStringAsync();
textBox1.AppendText(resultStr);
var smMsResponse = JsonConvert.DeserializeObject<SmMsResponseDto>(resultStr);
pictureBox1.ImageLocation = smMsResponse.Data.Url;
}
}
}
}
最终效果:
client.DefaultRequestHeaders.Add(“Authorization”, “放自己的token”);当前只是示例代码,正常这句不应该放在方法里面,因为不能重复添加,所以当前上传按钮只能成功一次,需要重新启动项目才能再次上传,所以需要自己根据业务修改代码。
其他的删除,查询上传历史等操作根据API文档去实现就好了
注意:使用httpClient最好使用单例,并且提前预热,不然就会很慢。