java-后端调用第三方接口返回图片流给前端

一、背景

有个需求是这样的,客户端直接通过外网访问oss获取图片需要额外付费,考虑到成本问题,修改技术方案为:客户端将请求链接发给后端,后端根据请求做一定的截取或拼接,通过内网调用oss,再将下载下来的图片流返回给前端。

图片流,展现在页面上就是直接返回一张图片在浏览器上。

二、具体代码展示 

前端期望,如果异常,直接把http status返回非200

@Slf4j
@RestController
public class PictureController {@Autowiredprivate PictureService pictureService;@RequestMapping(value = "getPicture")public void getPicture(String path, HttpServletResponse resp) {boolean picSuccess;// 注意:一定要有这步,否则图片显示不出来resp.setContentType(MediaType.IMAGE_JPEG_VALUE);long start = System.currentTimeMillis();try {picSuccess = pictureService.getOssPicture(path, resp);if (!picSuccess) {resp.setStatus(HttpServletResponse.SC_FORBIDDEN);}} catch (Exception e) {resp.setStatus(HttpServletResponse.SC_FORBIDDEN);log.error("下载图片失败!!");}log.info("cmd=/getPicture,param={},cost:{}", path, System.currentTimeMillis() - start);}
}
public interface PictureService {boolean getOssPicture(String path, HttpServletResponse resp) throws IOException;
}
@Slf4j
@Service
public class PictureServiceImpl implements PictureService {@Value("${alioss.ak}")private String accessKeyId;// http://*********.aliyuncs.com@Value("${url.prefix}")private String urlPrefix;@Value("${oss.connect.time:3000}")private int ossConnectTime;@Overridepublic boolean getOssPicture(String path, HttpServletResponse resp) throws IOException {String url = getOssUrl(path);long st = System.currentTimeMillis();Request requestDownload = new Request.Builder().url(url).build();OkHttpClient client = new OkHttpClient();client = client.newBuilder().connectTimeout(ossConnectTime, TimeUnit.MILLISECONDS).build();Response responseDownload = client.newCall(requestDownload).execute();if (responseDownload.isSuccessful() && responseDownload.body() != null && responseDownload.body().byteStream() != null) {InputStream is = responseDownload.body().byteStream();writeImageFile(resp, is);} else {log.error("PictureServiceImpl-oss调用返回异常: url={}, data={}", url, responseDownload);return false;}long responseTime = System.currentTimeMillis() - st;log.info("request-oss cost:{}", responseTime);return true;}// base64解码==这块是与前端约定好的,我这边要做的解码private String getOssUrl(String path) throws UnsupportedEncodingException {final Base64.Decoder decoder = Base64.getDecoder();String decodePath = new String(decoder.decode(path), "UTF-8");StringBuffer buffer = new StringBuffer();String[] split = decodePath.split("&");for (int i = 0; i < split.length; i++) {if (!split[i].startsWith("Version")) {buffer.append(split[i]).append("&");}}log.info("getOssUrl={}", urlPrefix + buffer);buffer.append("OSSAccessKeyId=").append(accessKeyId);return urlPrefix + buffer;}/*** 将输入流输出到页面** @param resp* @param inputStream*/public void writeImageFile(HttpServletResponse resp, InputStream inputStream) {OutputStream out = null;try {out = resp.getOutputStream();int len = 0;byte[] b = new byte[1024];while ((len = inputStream.read(b)) != -1) {out.write(b, 0, len);}out.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (out != null) {out.close();}} catch (Exception e) {e.printStackTrace();}}}
}

三、总结

上面就是返回图片流的方式;

记录下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APP分发-CDN加速原理

摘要 CDN的全称是(Content Delivery Network)&#xff0c;即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层&#xff0c;将网站的内容发布到最接近用户的网络”边缘“的节点&#xff0c;使用户可以就近取得所需的内容&#xff0c;提高用户访问网站的…

辅助驾驶功能开发-功能规范篇(23)-2-Mobileye NOP功能规范

5.2 状态机要求 5.2.1 NOP/HWP 状态机 NOP/HWP状态机如下所示: 下表总结了这些状态: 状态描述Passive不满足功能条件,功能无法控制车辆执行器。Standby满足功能条件。该功能不是由驾驶员激活的。功能不控制车辆执行器。Active - Main功能由驾驶员激活。功能是控制…

WebClient, HttpClient, OkHttp: 三个Java HTTP客户端的比较

在Java世界中&#xff0c;有许多用于发送HTTP请求的库。在本文中&#xff0c;我们将重点介绍并比较三种流行的HTTP客户端&#xff1a;WebClient&#xff0c;HttpClient和OkHttp。我们将通过讲解它们的基本概念&#xff0c;使用方法和示例&#xff0c;以及它们的优缺点&#xff…

Java零基础入门-逻辑运算符

前言 Java是一种广泛应用的编程语言&#xff0c;在在这里插入代码片软件开发中有着重要的地位。本文将介绍Java中的逻辑运算符及其在程序设计中的应用&#xff0c;希望能够帮助零基础的读者更好地入门学习Java。 摘要 本文将介绍Java中的三种逻辑运算符&#xff1a;与运算符…

点云从入门到精通技术详解100篇-基于尺度统一的三维激光点云与高清影像配准

目录 前言 研究现状 三维激光点云与影像配准研究现状 点云配准研究现状

Qt 序列化函数和反序列化函数

文章目录 界面学生类序列化函数反序列化函数刷新所选择的下拉表值添加 界面 学生类 // 创建学生信息类 class studentInfo { public:QString id; // 学号QString name; // 学生姓名QString age; // 学生年龄// 重写QDataStream& operator<<操作符&…

传智书城源码+课程设计文档基于JSP+Servlet实现

下载地址: https://juzhendongli.store/commodity/details/19 包括源码参考论文

华为---DHCP中继代理简介及示例配置

DHCP中继代理简介 IP动态获取过程中&#xff0c;客户端&#xff08;DHCP Client&#xff09;总是以广播&#xff08;广播帧及广播IP报文&#xff09;方式来发送DHCPDISCOVER和DHCPREQUEST消息的。如果服务器&#xff08;DHCP Server&#xff09;和 客户端不在同一个二层网络(二…

An Early Evaluation of GPT-4V(ision)

本文是LLM系列文章&#xff0c;针对《An Early Evaluation of GPT-4V(ision)》的翻译。 GPT-4V的早期评估 摘要1 引言2 视觉理解3 语言理解4 视觉谜题解决5 对其他模态的理解6 结论 摘要 在本文中&#xff0c;我们评估了GPT-4V的不同能力&#xff0c;包括视觉理解、语言理解、…

哪一个更好?Spring boot还是Node.js

前言 本篇文章有些与众不同&#xff0c;由于我自己手头有些关于这个主题的个人经验&#xff0c;受其启发写出此文。虽然SpringBoot和Node.js服务于很不一样的场景&#xff0c;但是这两个框架共性惊人。其实每种语言都有不计其数的框架&#xff0c;但仅仅一部分是真正卓越的。如…

第六节——Vue中的事件

一、定义事件 Vue 元素的事件处理和 DOM 元素的很相似&#xff0c;但是有一点语法上的不同 使用修饰符&#xff08;v-on:的缩写&#xff09;事件名的方式 给dom添加事件后面跟方法名&#xff0c;方法名可以直接加括号如click"add()"里面进行传参。对应的事件处理函…

计算机网络相关硬件介绍

计算机相关硬件 计算机由运算器、控制器、存储器、输入设备和输出设备等五个逻辑计算机硬件部件组成。 一、中央处理器&#xff08;CPU&#xff09;&#xff08;运算器、控制器&#xff09; &#xff08;1&#xff09;运算器 运算器是对数据进行加工处理的部件&#xff…

react151618刷新几次的问题

结论&#xff1a; 16 hooks版本 默认render1次 同步中&#xff0c;无论多少种类还是次数&#xff0c;都render 1次。 异步中&#xff0c;无论多少种类还是次数&#xff0c;1个种类执行1次&#xff0c;多次的话&#xff0c;用n*2。 18 hooks版本 默认render2次&#xff0c; 同步…

Ubuntu 内核降级到指定版本

reference https://www.cnblogs.com/leebri/p/16786685.html 前往此网站&#xff0c;找到所需的内核 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 查看系统架构 dpkg --print-architecture 二、下载安装包 注意&#xff1a;下载除lowlatency以外的deb包 三、安装内核 3…

JAVA基础(JAVA SE)学习笔记(八)面向对象编程(高级)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…

题目 1056: 二级C语言-温度转换(python详解)——练气四层初期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

ubuntu18.04设置开机自动启动脚本(以自动启动odoo命令行为例讲解)

简介 ubuntu作为服务器使用时&#xff0c;常常需要在机器重启时能自动启动我们开发的服务。 Ubuntu 16.10开始不再使用initd管理系统&#xff0c;改用systemd&#xff0c;包括用systemctl命令来替换了service和chkconfig的功能。 systemd 默认读取 /etc/systemd/system 下的配…

单目3D目标检测 方法综述——直接回归方法、基于深度信息方法、基于点云信息方法

本文综合整理单目3D目标检测的方法模型&#xff0c;包括&#xff1a;基于几何约束的直接回归方法&#xff0c;基于深度信息的方法&#xff0c;基于点云信息的方法。万字长文&#xff0c;慢慢阅读~ 直接回归方法 涉及到模型包括&#xff1a;MonoCon、MonoDLE、MonoFlex、CUPNet…

buuctf_练[MRCTF2020]Ezaudit

[MRCTF2020]Ezaudit 掌握知识 ​ 网站源码泄露&#xff0c;代码审计&#xff0c;SQL注入的万能密码使用&#xff0c;mt_rand函数的伪随机数漏洞搭配php_mt_seed工具使用&#xff0c;随机数特征序列的生成 解题思路 打开题目链接&#xff0c;又发现是一个不错的网站界面&…

给你一个整数 num ,返回 num 中能整除 num 的数位的数目

给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 示例 1&#xff1a; 输入&#xff1a;num 7 输出&#xff1a;1 解释&#xff1a;7 被自己整除&#xff0c;因此答案是 1 。 示例 2&…