目前越来越多的网站做了图片防盗链,对我们实际开发造成了不小的影响 。特别是微信的素材库,一直得不到图片内容。
前前后后用了很多方案,包括使用搜狗图片加载,传送门图片加载,QQ浏览器加载,但是终究不是自己的,而且越来越不稳定。 最后花了一个上午研究了一下,最终采用后端下载图片,前端显示的方案。
1、使用HttpURLConnection得到inputStream。 参数为图片地址
public static InputStream getInputStream(String url_path) {
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null;
try {
URL url = new URL(url_path);
httpURLConnection = (HttpURLConnection) url.openConnection();
// 设置连接网络的超时时间
httpURLConnection.setConnectTimeout(3000);
httpURLConnection.setDoInput(true);
httpURLConnection.setRequestMethod("GET");
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == 200) {
inputStream = httpURLConnection.getInputStream();
}
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
2、设置response
response.reset();
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/png");
/**
* 改变图片的大小到宽为size,然后高随着宽等比例变化
*
* @param is 上传的图片的输入流
* @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
* @param size 新图片的宽
* @param format 新图片的格式
* @throws IOException
*/
public static void resizeImage(InputStream is, OutputStream os, int size,
String format) throws IOException {
BufferedImage prevImage = ImageIO.read(is);
double width = prevImage.getWidth();
double height = prevImage.getHeight();
double percent = size / width;
int newWidth = (int) (width * percent);
int newHeight = (int) (height * percent);
BufferedImage image = new BufferedImage(newWidth, newHeight,
BufferedImage.TYPE_INT_BGR);
Graphics graphics = image.createGraphics();
graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null);
ImageIO.write(image, format, os);
os.flush();
is.close();
os.close();
}
4、方法调用
public void getImage(HttpServletResponse response, String url, Integer w) {
InputStream inputStream = ImageFileUtil.getInputStream(url);
try {
// 清空response
response.reset();
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/png");
OutputStream os = new BufferedOutputStream(response.getOutputStream());
w = null == w ? 200 : w;
ImageFileUtil.resizeImage(inputStream, os, w, "png");
os.flush();
inputStream.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}