在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
小程序上线后会接到这种警告
ImageUtil代码 import lombok.extern.slf4j.Slf4j; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.net.URL; /** * @author 小帅丶 * @className ImageUtil * @Description 图片缩放 * @Date 2020/9/29-9:58 **/ @Slf4j public class ImageUtil { /** * 缩放比例系数 */ private static double SCALING = 0.56; /** * 符合base64的宽 */ private static int MAX_WIDTH = 560; /** * 最大高 */ private static int MAX_HEIGHT = 1000; /** * @Author 小帅丶 * @Description 根据图片公网地址转BufferedImage * @Date 2020/9/29 10:52 * @param url 图片公网地址 * @return java.awt.image.BufferedImage **/ public static BufferedImage imgUrlConvertBufferedImage(String url) throws Exception { URL urls = new URL(url); Image image = Toolkit.getDefaultToolkit().getImage(urls); BufferedImage bufferedImage = toBufferedImage(image); return bufferedImage; } /** * @Author 小帅丶 * @Description 根据BufferedImage处理图片并返回byte[] * @Date 2020/9/29 10:55 * @param bufferedImage * @return byte[] **/ public static byte[] zoomImageByte(BufferedImage bufferedImage) throws Exception { ByteArrayOutputStream outputStreamZoom = new ByteArrayOutputStream(); ByteArrayOutputStream outputStreamSource = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, "jpg", outputStreamSource); BufferedImage bufferedImageZoom = zoomImage(outputStreamSource.toByteArray()); //写入缩减后的图片 ImageIO.write(bufferedImageZoom, "jpg", outputStreamZoom); return outputStreamZoom.toByteArray(); } /** * @Author 小帅丶 * @Description 根据byte[]处理图片并返回byte[] * @Date 2020/9/29 10:55 * @param src * @return byte[] **/ public static byte[] zoomImageByte(byte[] src) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); BufferedImage bufferedImage = zoomImage(src); //写入缩减后的图片 ImageIO.write(bufferedImage, "jpg", outputStream); return outputStream.toByteArray(); } /** * 图片缩放 仅适用于微信内容图片安全检测使用 * * @param src 为源文件byte */ public static BufferedImage zoomImage(byte[] src) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayInputStream in = new ByteArrayInputStream(src); double wr = 0, hr = 0; BufferedImage bufferedImage = null; //读取图片 BufferedImage bufImg = ImageIO.read(in); int height = bufImg.getHeight(); int width = bufImg.getWidth(); int cHeight = height; int cWidth = width; double Scaling = width / height; if (Scaling < SCALING) { if (height > MAX_HEIGHT) { cHeight = MAX_HEIGHT; cWidth = (width * MAX_HEIGHT) / height; } //以宽为缩放比例 } else { if (width > MAX_WIDTH) { cWidth = MAX_WIDTH; cHeight = (height * MAX_WIDTH) / width; } } //获取缩放后的宽高 log.info("宽{},高{}", cWidth, cHeight); //设置缩放目标图片模板 Image Itemp = bufImg.getScaledInstance(width, cHeight, BufferedImage.SCALE_SMOOTH); //获取缩放比例 wr = cWidth * 1.0 / width; hr = cHeight * 1.0 / height; log.info("宽比例{},高比例{}", wr, hr); AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(wr, hr), null); Itemp = ato.filter(bufImg, null); try { //写入缩减后的图片 ImageIO.write((BufferedImage) Itemp, "jpg", outputStream); ByteArrayInputStream inNew = new ByteArrayInputStream(outputStream.toByteArray()); bufferedImage = ImageIO.read(inNew); } catch (Exception ex) { log.info("缩放图片异常{}", ex.getMessage()); } finally { if (null != outputStream) { outputStream.close(); } if (null != in) { in.close(); } } return bufferedImage; } /** * @Author 小帅丶 * @Description Image转BufferedImage * @Date 2020/9/29 10:47 * @param image 通过url获取的image对象 * @return java.awt.image.BufferedImage **/ public static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) { return (BufferedImage) image; } // This code ensures that all the pixels in the image are loaded image = new ImageIcon(image).getImage(); BufferedImage bimage = null; GraphicsEnvironment ge = GraphicsEnvironment .getLocalGraphicsEnvironment(); try { int transparency = Transparency.OPAQUE; GraphicsDevice gs = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = gs.getDefaultConfiguration(); bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency); } catch (HeadlessException e) { // The system does not have a screen } if (bimage == null) { // Create a buffered image using the default color model int type = BufferedImage.TYPE_INT_RGB; bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); } // Copy image to buffered image Graphics g = bimage.createGraphics(); // Paint the image onto the buffered image g.drawImage(image, 0, 0, null); g.dispose(); return bimage; } } WeiXinUtil代码 private static Integer IMG_WIDTH = 750; private static Integer IMG_HEIGHT = 1334; /** * 图片检测接口 */ private static String IMG_SEC_URL = "https://api.weixin.qq.com/wxa/img_sec_check?access_token="; /** * @Author * @Description 图片安全检查 * @Date 2021.07.02 * @param imageUrl 图片公网地址 /适用oss url(referer限制也没事)/适用oss sts 生成url * @param access_token 微信的token * @return **/ public Boolean checkPic(String imageUrl,String access_token) throws Exception{ BufferedImage bufferedImage = ImageUtil.imgUrlConvertBufferedImage(imageUrl); String url = IMG_SEC_URL + access_token; //750px * 1334px if (bufferedImage.getWidth() > IMG_WIDTH || bufferedImage.getHeight() > IMG_HEIGHT) { //缩放图片 byte[] newImage = ImageUtil.zoomImageByte(bufferedImage); wxutil 里面两个方法 /** * 上传二进制文件 * @param graphurl 这个地址为微信公众平台的 * @param file 图片文件 * @return */ public static String uploadFile(String graphurl,MultipartFile file) { String line = null;//接口返回的结果 try { // 换行符 final String newLine = "\r\n"; final String boundaryPrefix = "--"; // 定义数据分隔线 String BOUNDARY = "========7d4a6d158c9"; // 服务器的域名 URL url = new URL(graphurl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置为POST情 conn.setRequestMethod("POST"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 设置请求头参数 conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY); conn.setRequestProperty("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"); OutputStream out = new DataOutputStream(conn.getOutputStream()); // 上传文件 StringBuilder sb = new StringBuilder(); sb.append(boundaryPrefix); sb.append(BOUNDARY); sb.append(newLine); // 文件参数,photo参数名可以随意修改 sb.append("Content-Disposition: form-data;name=\"image\";filename=\"" + "https://api.weixin.qq.com" + "\"" + newLine); sb.append("Content-Type:application/octet-stream"); // 参数头设置完以后需要两个换行,然后才是参数内容 sb.append(newLine); sb.append(newLine); // 将参数头的数据写入到输出流中 out.write(sb.toString().getBytes()); // 读取文件数据 out.write(file.getBytes()); // 最后添加换行 out.write(newLine.getBytes()); // 定义最后数据分隔线,即--加上BOUNDARY再加上--。 byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine).getBytes(); // 写上结尾标识 out.write(end_data); out.flush(); out.close(); // 定义BufferedReader输入流来读取URL的响应 BufferedReader reader = new BufferedReader(new InputStreamReader( conn.getInputStream())); while ((line = reader.readLine()) != null) { return line; } } catch (Exception e) { System.out.println("发送POST请求出现异常!" + e); } return line; } /** * 上传二进制文件 * @param apiurl 公众平台接口地址 * @param file 图片文件 * @return */ public static String uploadFile(String apiurl, byte[] file) { //接口返回的结果 String line = null; try { // 换行符 final String newLine = "\r\n"; final String boundaryPrefix = "--"; // 定义数据分隔线 String BOUNDARY = "========7d4a6d158c9"; // 服务器的域名 URL url = new URL(apiurl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置为POST情 conn.setRequestMethod("POST"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 设置请求头参数 conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY); conn.setRequestProperty("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.15(0x17000f31) NetType/WIFI Language/zh_CN"); OutputStream out = new DataOutputStream(conn.getOutputStream()); // 上传文件 StringBuilder sb = new StringBuilder(); sb.append(boundaryPrefix); sb.append(BOUNDARY); sb.append(newLine); // 文件参数,photo参数名可以随意修改 sb.append("Content-Disposition: form-data;name=\"image\";filename=\"" + "https://api.weixin.qq.com" + "\"" + newLine); sb.append("Content-Type:application/octet-stream"); // 参数头设置完以后需要两个换行,然后才是参数内容 sb.append(newLine); sb.append(newLine); // 将参数头的数据写入到输出流中 out.write(sb.toString().getBytes()); // 读取文件数据 out.write(file); // 最后添加换行 out.write(newLine.getBytes()); // 定义最后数据分隔线,即--加上BOUNDARY再加上--。 byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine).getBytes(); // 写上结尾标识 out.write(end_data); out.flush(); out.close(); // 定义BufferedReader输入流来读取URL的响应 BufferedReader reader = new BufferedReader(new InputStreamReader( conn.getInputStream())); while ((line = reader.readLine()) != null) { return line; } } catch (Exception e) { System.out.println("发送POST请求出现异常!" + e); } return line; }
最后自己 在控制层 直接传入文本或图片 返回true代表有违规图片或者文字 给出自己业务提示语 例如:您的图片或文字包含敏感信息不合法
nohup java -jar xxx.jar >/dev/null 2>&1 & |
请发表评论