内外网中图片无法访问的问题解决

项目背景:项目的后台部署在内网服务器linux_A上,在内网服务器linux_B上部署了nginx_A,linux_A和linux_B网络是打通了的,前台代码部署在nginx_A中。

同时在外网服务器linux_C中部署了nginx_B,nginx_B做了代理设置,所有请求到这台服务器都转向了nginx_A(其实内网服务器linux_B和外网服务器linux_C之间存在一个跳板机,nginx_B中的请求都指向这个跳板机,然后跳板机调到linux_B)

 

问题描述:现在后端有一个接口,接口返回格式如下:   

{"logo":"http://ip:port/image/xxxxxxxxxxx"}

这个logo的数据为一个完整的地址,后端将这个地址直接传给前端,前端在<img src="">标签中直接放进src属性中,就可以显示出图片,但是问题是这个完整地址同属于内网,在内网环境能正常显示,但是在外网环境不能访问。

 

解决办法:获取这个完整地址,在后台直接去请求,然后将请求结果加密,在加密后的字符串头拼上"data:image/png;base64,",再将这传字符串传给前台,拼在src属性中打开,工具方法的代码如下:

//请求和加密方法
public static String encodeBase64File(String path) throws Exception {
		//创建httpclient对象
	        CloseableHttpClient httpClient = HttpClients.createDefault();
	        //创建Http get请求
	        HttpGet httpGet = new HttpGet(path);
	        //接收返回值
	        CloseableHttpResponse response = null;
	        try {
	            //请求执行
	            response = httpClient.execute(httpGet);
	            if(response.getStatusLine().getStatusCode()==200){
	            	HttpEntity entity = response.getEntity();
	            	InputStream content = entity.getContent();
	            	ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
	                byte[] buff = new byte[100];
	                int rc = 0;
	                while ((rc = content.read(buff, 0, 100)) > 0) {
	                    byteArrayOutputStream.write(buff, 0, rc);
	                }
	                byte[] buffer = byteArrayOutputStream.toByteArray();
	                byteArrayOutputStream.close();
	                content.close();
	                
	                String encode = new BASE64Encoder().encode(buffer);
					encode = encode.replaceAll("[\\s*\t\n\r]", "");
	    	        return encode;
	    	       
	            }
	        } catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}finally{
	            if(response!=null){
	                try {
						response.close();
					} catch (IOException e) {}
	            }
	            try {
					httpClient.close();
				} catch (IOException e) {}
	        }
	        return null;
	    }

  

posted @ 2022-03-08 17:08  leviH  阅读(1016)  评论(0编辑  收藏  举报