将图片地址转为二进制(博客自定义随机背景图API)
背景
最近写博客。
觉得自己的博客毫无生机,想加一些图片。
于是在找了一些三方的随机图片链接
,发现一些问题:
给的些链接不会直接返回图片,
要么是302重定向
要么是返回json
这导致,这个链接无法直接使用在css的background-image: url(xxx)
中。
解决思路
后端代理
1、拿到图片真实地址,
2、并将其转换为二进制返回给前端
HttpHelper.java
package com.dshvv.blogserver.utils;
import com.alibaba.fastjson.JSONObject;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.springframework.stereotype.Component;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
@Component
public class HttpHelper {
/*
* 根据url地址返回json
* */
public JSONObject sendGetReturnJson(String url) throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
// 执行请求
CloseableHttpResponse response = httpClient.execute(new HttpGet(url));
// 获取响应体
HttpEntity entity = response.getEntity();
// 获取响应内容
String contentStr = EntityUtils.toString(entity, "utf-8");
// 关闭连接,释放资源
response.close();
httpClient.close();
return JSONObject.parseObject(contentStr);
}
/*
* 根据url地址返回二进制
* */
public BufferedInputStream sendGetReturnStream(String url) throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
// 执行请求
CloseableHttpResponse response = httpClient.execute(new HttpGet(url));
// 获取响应体
HttpEntity entity = response.getEntity();
// 获取响应内容
byte[] contentByteArray = EntityUtils.toByteArray(entity);
ByteArrayInputStream byteInputStream = new ByteArrayInputStream(contentByteArray);
BufferedInputStream imgStream = new BufferedInputStream(byteInputStream);
// 关闭连接,释放资源
response.close();
httpClient.close();
return imgStream;
}
}
OtherController.js
package com.dshvv.blogserver.controller;
import com.dshvv.blogserver.utils.*;
import io.swagger.annotations.ApiOperation;
import org.junit.platform.commons.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@RequestMapping
@RestController
public class OtherController {
@Autowired
private HttpHelper httpHelper;
// 随机获取一张二次元图片
@ApiOperation("随机获取一张二次元图片")
@GetMapping(value = {"/img", "/img/{type}"})
public void getImg(HttpServletResponse response, @PathVariable(value = "type", required = false) String type) throws Exception {
String imgApiUrl = "https://api.ixiaowai.cn/api/api.php?return=json";
if (!StringUtils.isBlank(type)) {
if (type.equals("fj")) {
imgApiUrl = "https://api.ixiaowai.cn/gqapi/gqapi.php?return=json";
}
}
// 拿到图片的url
String imgUrl = (String) httpHelper.sendGetReturnJson(imgApiUrl).get("imgurl");
System.out.println(imgUrl);
// 根据图片url拿到二进制流 并返回前端
BufferedInputStream imgStream = httpHelper.sendGetReturnStream(imgUrl);
OutputStream out = response.getOutputStream();
// 读取文件流
int len = 0;
byte[] buffer = new byte[1024 * 10];
while ((len = imgStream.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.flush();
out.close();
}
}
遇到的坑
在使用HttpClient时,封装了工具一度存在问题,最后网上排查发现EntityUtils只能使用一次,使用了EntityUtils.toByteArray()方法,上面就不能再使用EntityUtils.toString()。
期间一度准备放弃转听同事@朱杰
的使用原生的http请求工具HttpURLConnection
,但是大家都说原生的不好,就坚持下来了。
将图片地址转为二进制(博客自定义随机背景图API)的更多相关文章
- 如何在CSDN博客自定义栏目中添加“给我写信”
在"自定义栏目"中添加"连接"(将自己的微博,QQ空间和CSDN博客关联起来)很多人都做过.但是添加"给我写信"这个功能,用的好像不太多.此 ...
- 关于hexo博客自定义域名后gitment评论系统登陆出现redirect error返回主页的解决办法
title: 关于hexo博客自定义域名后gitment评论系统登陆出现redirect error返回主页的解决办法 toc: false date: 2018-04-16 22:57:50 cat ...
- 怎样将word中的图片插入到CSDN博客中
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- 博客自定义1-皮肤模板 基于SimpleMemory 添加到顶部小按钮
周五公司事不是很紧,打算好好弄下自己的博客,这是自己学习和记录分享地方, 首先请记得申请js权限,默认不支持的,博主是已经申请通过后的样子 接着先选择cnblogs一个现有的模板,我这个就是在他的模板 ...
- cnblogs博客自定义
我使用的是博友分享的CCS设计:http://www.cnblogs.com/libaoheng/archive/2012/03/19/2406836.html CSS定制页面风格 /*公用*/ bo ...
- 把cnblogs变成简书 - cnblogs博客自定义皮肤css样式
吐槽 博客园cnblogs作为老牌的IT技术博客类网站,为广大的开发者提供了非常不错的学习交流平台. 虽然博客内容才是重点,但是如果有赏心悦目的页面不更好吗! cnblogs可以更换博客模板,并且提供 ...
- IP地址转为二进制,去掉0b补齐八位拼接,再转为十进制
#!/usr/bin/env python# -*- coding:utf-8 -*- ip = '192.168.0.1' # 转为二进制:# 方法一'''eve = ip.split('.')s ...
- 将图片地址转为blob格式的例子
HTML代码: <div id="forAppend" class="demo"></div> Javascript代码: <sc ...
- 【软件学习】如何将Typora中的本地图片上传到博客
1. 配置方法 下载软件: 点击程序输入博客信息进行配置: 进行偏好设置: 2. 配置中出现的一些问题 解决方法:
- 博客中新浪图床 迁移至 阿里云的OSS
前言 因为之前有个新浪的图床,还挺好用,而且免费,自己博客的图片上传到其上面也挺方便的,但是,前几周吧,突然图片就不能访问了,之前本来是想通过添加 meta 头来解决的,但是发现没有效果.于是就自己搞 ...
随机推荐
- JDBC-增删查改操作
使用场景:测试家族族长分成时需要批量添加家族流水记录,但手动添加和SQL语句添加较为麻烦 操作步骤 运行环境:Java8+IDEA 1.打开IDEA 点击File->New->Projec ...
- idea git建立分支、切换分支、合并分支
为什么要建立分支 git默认的主分支名字为master,一般团队开发时,都不会在master主分支上修改代码,而是建立新分支,测试完毕后,在将分支的代码合并到master主分支上 2.操作如下: 2. ...
- 使用XML的方式编写:@Aspect运用
例子. 接口 public interface Calculator { // 加 public int add(int i, int j); // 减 public int sub(int i, i ...
- docker容器运行,交互式与守护式的区别
一.使用交互式运行容器,容器运行后直接进入到容器内部,退出容器内部后,容器直接关闭
- 揭秘AI自动化框架Browser-use(二),如何构造大模型提示词
在上一篇技术分析中,我们探讨了Browser-use框架如何实现页面元素标注.本文将聚焦于其提示词构造流程,揭示AI如何理解浏览器界面的核心机制. 上一篇-揭秘AI自动化框架Browser-use(一 ...
- [python] 基于WatchDog库实现文件系统监控
Watchdog库是Python中一个用于监控文件系统变化的第三方库.它能够实时监测文件或目录的创建.修改.删除等操作,并在这些事件发生时触发相应的处理逻辑,因此也被称为文件看门狗. Watchdog ...
- FastAPI数据库连接池配置与监控
title: FastAPI数据库连接池配置与监控 date: 2025/04/28 00:13:02 updated: 2025/04/28 00:13:02 author: cmdragon ex ...
- Codeforces Round 978 (Div. 2) A-D1 题解
A. Bus to Pénjamo 题意 有一辆车上面有 \(r\) 排座位,每排有 \(2\) 个座位,现在共 \(n\) 个家庭出行坐公交车,每个家庭 \(a_i\) 个人(保证 \(2r\ge ...
- linux期末考试题(2)
linux期末考试题 一.选择题(共30分,每小题2分) 1.以下关于自由软件的说法,正确的是(D) A.自由软件是一种有版权保护的软件 B.修改自由软件应取得原作者的许可 C.微软的 Ofice 软 ...
- 时间工具之“js初始化当前时间数据”
⑨前端:初始化当前时间数据 方案一(峰哥认可) // 2023-02this.$moment().format('yyyy-MM'),// 2023-02-02this.$moment().form ...