利用水墨映客图床作为COS服务器

打印 上一主题 下一主题

主题 854|帖子 854|积分 2564

目录

利用水墨映客作为COS服务器

文章类网站项目的图片存储都是一个很重要的问题,一般都是利用云服务厂商的COS对象存储服务(参考前文:利用腾讯云对象存储搭建图床) ,固然小网站的需求不大,购买也不贵,但是照旧想能不能找个免费的,究竟能省就省嘛。
寻常有些博客或者笔记的都是用markdown编辑,图片一般都是上传图床,但是很多图床都没有开放接口。最近用途经图床的时候网站没打开,咨询管理说有DNS污染,便又搜索有没有好用一些的图床,就发现了水墨映客图床,固然容量有限,但是他每天签到都可以扩充容量,而且最最重要的我发现水墨映客开放上传接口,于是就开始鼓捣想着利用水墨映客作为COS服务器。
水墨图床地址:图片映客--水墨图床,免费专业的高速外链图床


分为两种,一种照旧利用picGo配合typora,另一种是在SpringBoot中开发为工具类专门用作图片上传。
利用picGo配合typora上传图片

安装PicGo(以Windows为例)

先下载PicGo的客户端安装包,找到对应的平台安装包然后下载。
下载链接:
(我的电脑:Windows11,64位,故下载PicGo-Setup-2.3.1-x64.exe)

下载之后正常安装就可以了。

安装lankong插件

这是一个为 兰空图床适配开发的 PicGo 图片上传插件。同样适用于水墨映客图床
在picGo的插件设置中搜索lankong,然后安装。

安装后配置



  • Lsky Pro Version 在下拉菜单中选择 Lsky Pro 版本,V1 照旧 V2,默认 V1
  • 填写图床的 server url,注意不要以 / 结束

    • https://image.example.com ✅️
    • https://image.example.com/ ❌️

  • 填写 Auth Token 利用 Bearer  拼接,token在水墨映客的设置中获取,注意在配置时候需要前面拼接Bearer

  • Strategy ID,存储策略 ID,如果是 V1 或 V2 利用默认存储策略的用户,请留空;除非你知道具体 ID,否则请留空
  • Album ID,相册 ID,只针对 V2 有用
  • Permission,图片权限,公开照旧私有,默认是私有
  • Sync Delete 同步删除选项,只支持 V2,开启后在 PicGo 相册中删除图片可同步删除图床上的文件,默认关闭
  • Ignore certificate error 开关,默认关闭,请保持关闭,除非你碰到 certificate has expired 等证书报错才需要思量将其开启。由于有些站点利用 Let's Encrypt 颁发的免费证书,有用期只有 90 天,在测试上传中碰到了 certificate has expired 错误,打开开关 Ignore certificate error 即可乐成上传
配置完毕保存即可,然后再typora里配置图片上传服务即可。

在SpringBoot中开发图片上传工具类

该工具类的方法有两个参数一个是文件名(fileName),另一个是文件的输入流。
在Spring Boot中一般利用MultipartFile类来处理文件相干,在此处可以通过getInputStream()方法获取文件的输入流
重要的步调分为:

  • 设置图片上传请求的参数
  • 设置图片的参数
  • 读取图片内容并写入请求
  • 获取相应
水墨映客图床的上传接口为https://img.ink/api/upload,如果上传乐成状态码返回200,失败返回500
上传乐成的返回格式:
  1. {
  2.     "code":200,
  3.     "msg":"success",
  4.     "data":                  
  5.         {
  6.             "id":"281381",
  7.             "name":".jpg",
  8.             "url":"https:\/\/pic2.ziyuan.wang\/user\/userNickName\/2024\/04\/fileName_d75b474147589.jpg",               "size":101168,
  9.             "mime":"image\/jpeg",
  10.             "sha1":"9adb76331eb1254567547afea3e516ac1901eac1",
  11.             "md5":"aef7bc728fd44e77d5688529c8122882",
  12.             "quota":"6485442560.00",
  13.             "use_quota":"6666141.00"
  14.         },
  15.     "time":1714282312
  16. }
复制代码
设置图片上传请求的参数
  1. // 设置上传地址
  2. URL url = new URL("https://img.ink/api/upload");
  3. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  4. // 设置请求方法为POST
  5. connection.setRequestMethod("POST");
  6. connection.setDoOutput(true);
  7. // 设置请求头
  8. connection.setRequestProperty("token", "你的请求头"); // 替换为你的token,在设置中获取
  9. // 构建请求参数
  10. String boundary = Long.toHexString(System.currentTimeMillis());//用来标识multipart/form-data内容类型的边界字符串,使用时间戳,确保每次请求的边界字符串都是唯一的,以避免冲突
  11. connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);//设置上传文件的格式
  12. OutputStream output = connection.getOutputStream();//获取与HTTP连接关联的输出流
  13. PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"), true);//向输出流写入文本形式的数据
复制代码
设置图片的参数
  1. writer.append("--" + boundary).append("\r\n");//添加了一个分隔边界标记
  2. writer.append("Content-Disposition: form-data; name="image"; filename="" + fileName + """).append("\r\n");//设置Content-Disposition头部信息,
  3. writer.append("Content-Type: image/jpeg").append("\r\n");//声明上传文件的MIME类型为image/jpeg
  4. writer.append("\r\n");//回车换行符作为分隔
  5. writer.flush();
复制代码
读取图片内容并写入请求
  1. //接受传入的输入流
  2. InputStream input = inputStream;
  3. byte[] buffer = new byte[4096];//临时存储从输入流中读取的数据
  4. int bytesRead;
  5. //持续读取输入流中的数据直到没有数据
  6. while ((bytesRead = input.read(buffer)) != -1) {
  7.     output.write(buffer, 0, bytesRead);
  8. }
  9. output.flush();
  10. input.close();
  11. // 结束整个multipart/form-data请求体
  12. writer.append("\r\n").append("--" + boundary + "--").append("\r\n");
  13. writer.close();
复制代码
获取相应
  1. //获取服务器对上传请求的响应状态码,200代表上传成功
  2. int responseCode = connection.getResponseCode();
  3. if (responseCode == HttpURLConnection.HTTP_OK) {
  4.     BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  5.     String line;
  6.     StringBuffer response = new StringBuffer();
  7.     //逐行读取服务器返回的文本数据
  8.     while ((line = reader.readLine()) != null) {
  9.         response.append(line);
  10.     }
  11.     reader.close();
  12.     ObjectMapper mapper = new ObjectMapper();
  13.     //使用Jackson库的ObjectMapper来解析response中的JSON字符串为JsonNode对象
  14.     JsonNode rootNode = mapper.readTree(String.valueOf(response));
  15.     //从解析出的JSON对象中,通过路径rootNode.path("data")定位到"data"节点,再从该节点下获取"url"字段的值,即图片上传后的URL
  16.     JsonNode userNode = rootNode.path("data");
  17.     String imgUrl = userNode.path("url").asText();
  18.     return imgUrl;
  19. } else {
  20.     return "error";
  21. }
复制代码
调用该方法时的利用(file为MultipartFile对象):
  1. String originalFilename = file.getOriginalFilename();//获取完整文件名
  2. String fileName = originalFilename.substring(originalFilename.lastIndexOf("."));//获取文件名后缀
  3. String url = InkImageUtil.uploadImg(fileName,file.getInputStream());//调用方法上传图片
复制代码
测试:


源码:
  1. public class InkImageUtil {
  2.     public static String uploadImg(String fileName,InputStream inputStream) throws IOException {
  3.             // 设置上传地址
  4.             URL url = new URL("https://img.ink/api/upload");
  5.             HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  6.             // 设置请求方法为POST
  7.             connection.setRequestMethod("POST");
  8.             connection.setDoOutput(true);
  9.             // 设置请求头
  10.             connection.setRequestProperty("token", "f3ee57bcc8d796ea9b72bd776f243d98"); // 替换为你的token
  11.             // 构建请求参数
  12.             String boundary = Long.toHexString(System.currentTimeMillis());
  13.             connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
  14.             OutputStream output = connection.getOutputStream();
  15.             PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"), true);
  16.             // 添加图片参数
  17.             writer.append("--" + boundary).append("\r\n");
  18.             writer.append("Content-Disposition: form-data; name="image"; filename="" + fileName + """).append("\r\n");
  19.             writer.append("Content-Type: image/jpeg").append("\r\n");
  20.             writer.append("\r\n");
  21.             writer.flush();
  22.             // 读取图片内容并写入请求
  23.             InputStream input = inputStream;
  24.             byte[] buffer = new byte[4096];
  25.             int bytesRead;
  26.             while ((bytesRead = input.read(buffer)) != -1) {
  27.                 output.write(buffer, 0, bytesRead);
  28.             }
  29.             output.flush();
  30.             input.close();
  31.             // 结束请求
  32.             writer.append("\r\n").append("--" + boundary + "--").append("\r\n");
  33.             writer.close();
  34.             // 获取响应
  35.             int responseCode = connection.getResponseCode();
  36.             if (responseCode == HttpURLConnection.HTTP_OK) {
  37.                 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  38.                 String line;
  39.                 StringBuffer response = new StringBuffer();
  40.                 while ((line = reader.readLine()) != null) {
  41.                     response.append(line);
  42.                 }
  43.                 reader.close();
  44.                 System.out.println(response.toString());
  45.                 ObjectMapper mapper = new ObjectMapper();
  46.                 JsonNode rootNode = mapper.readTree(String.valueOf(response));
  47.                 JsonNode userNode = rootNode.path("data");
  48.                 String imgUrl = userNode.path("url").asText();
  49.                 return imgUrl;
  50.             } else {
  51.                 return "error";
  52.             }
  53.     }
  54. }
复制代码
  1. @PostMapping("/upload")
  2.     public Result<String> fileUpload(MultipartFile file) throws IOException {
  3.         String originalFilename = file.getOriginalFilename();
  4.         String fileName = originalFilename.substring(originalFilename.lastIndexOf("."));
  5.         String url = InkImageUtil.uploadImg(fileName,file.getInputStream());
  6.         return Result.success(url);
  7.     }
复制代码
接待关注公众号:愚生浅末


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表