将图片地址转为二进制(博客自定义随机背景图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 头来解决的,但是发现没有效果.于是就自己搞 ...
随机推荐
- 剖析 Docker Swarm 操作对容器端口影响
剖析 Docker Swarm 操作对容器端口影响 一.背景阐述 在使用 Docker Swarm 构建集群环境过程中,于 ts3 节点出现了原有的容器端口全部失效,手动重启后才恢复的情况.期间涉及 ...
- File类使用详解
File类是java io包下代表与平台无关的文件和目录,也就是说,在程序中操作文件和目录都可以通过File类来完成.但是File不能访问文件内容本身,访问文件内容需要使用输入/输出流. File类的 ...
- MySQL 的查询优化器如何选择执行计划?
MySQL 的查询优化器负责决定如何执行 SQL 查询,它会根据多个因素选择最优的执行计划.查询优化器的目标是选择一个成本最低.性能最优的执行计划,以便高效地处理查询.执行计划的选择是基于 MySQL ...
- DPDI(Dispatch PDI)kettle调度管理平台介绍
DPDI online产品简介 DPDI Online 是一款基于Kettle的强大在线任务调度平台,凭借其高效与灵活性,专为调度和监控Kettle客户端生成的ETL任务而设计 DPDI Online ...
- 电商商品推荐系统实战:基于TensorFlow Recommenders构建智能推荐引擎
引言:推荐系统的商业价值与实现挑战 在电商领域,推荐系统承担着提升用户转化率和平台GMV的核心使命.根据麦肯锡研究,亚马逊35%的销售额来自推荐系统,Netflix用户75%的观看行为由推荐驱动.传统 ...
- 9.30SDFZCSP-J模考总结
我是傻逼我是傻逼我是傻逼我是傻逼\Huge我是傻逼我是傻逼\\我是傻逼我是傻逼\\我是傻逼我是傻逼我是傻逼我是傻逼 T3数组开小痛失50pts!!!!!! 分数 T1 T2 T3 T4 总分 100p ...
- 容器化 MCP Server!
大家好!我是韩老师. 本文是 MCP 系列文章的第五篇,之前的四篇是: Code Runner MCP Server,来了! 从零开始开发一个 MCP Server! 一键安装 MCP Server! ...
- 17.1K star!两小时就能训练出专属于自己的个性化小模型,这个开源项目让AI触手可及!
「只需一张消费级显卡,2小时完成26M参数GPT训练!」「从零构建中文大模型的最佳实践指南」「兼容OpenAI API,轻松接入各类AI应用平台」 项目介绍 MiniMind是由开发者Jingyao ...
- LitePal库---DataSupport类被弃用
用LitePalSupport类替换 在使用LitePal库进行CRUD时需要我们的类继承DataSupport类,发现这个类被弃用了, /** * DataSupport is deprecated ...
- Mybatis 框架课程第三天
目录 1 Mybatis连接池与事务深入 1.1 Mybatis的连接池技术 1.1.1 Mybatis连接池的分类 1.1.2 Mybatis中数据源的配置 1.2 Mybatis 的事务控制 1. ...