java如何通过图片链接获取图片的格式 5C

要将图片通过链接下载到本地然后在上传到自己的服务器上 但是图片的格式是无法获取到
存入到本地的都是判断出来的格式 有一些是不正确的

  URL url = new URL(matcher2.group().substring(5, matcher2.group().length() - 1));
                        String last = getUrl(String.valueOf(url));
                        URLConnection con = url.openConnection();
                        con.setConnectTimeout(120 * 1000);
                        InputStream is = con.getInputStream();
                        byte[] bs = new byte[1024];
                        int len;
                        String xxUrl = "temp";
                        File sf = new File(xxUrl);
                        if (!sf.exists()) {
                            sf.mkdirs();
                        }
                        String uuid32 = getUUID32();
                        OutputStream os = new FileOutputStream(sf.getPath() + "/" + uuid32 + last);

在outPut的时候last就是图片的格式 但是不知道怎么通过链接获取图片格式 请教一下大佬帮忙看一下有什么事可以解决的
图片链接
https://mmbiz.qpic.cn/mmbiz_jpg/FJYxahcppx2C9jyw4hJQKH9R9Ws8LdPicmrAvfw7kS1Tau6PuLP7eOBjqybtiaT9icJo9OupL9ibMdAIFBnR2wtvSQ/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

2个回答

使用后缀获取图片格式是不可取的,每一个图片文件都是可以解析的,在他们的元数据区都存在魔数,我们可以通过魔数进行判断该图片类型。

 import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ImageTest {

    /**
     * 读取文件的前10个字节
     *
     * @return  前10个字节
     */
    private static byte[] readFileTenBytes(File file) {
        byte[] buffer = new byte[10];
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            //noinspection ResultOfMethodCallIgnored
            fileInputStream.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return buffer;
    }

    /**
     * 字节数组转成16进制表示格式的字符串
     *
     * @param byteArray
     *            需要转换的字节数组
     * @return 16进制表示格式的字符串
     **/
    private static String toHexString(byte[] byteArray) {
        StringBuilder hexString = new StringBuilder();
        for (byte aByteArray : byteArray) {
            if ((aByteArray & 0xff) < 0x10) {
                hexString.append("0");
            }
            hexString.append(Integer.toHexString(0xFF & aByteArray));
        }
        return hexString.toString().toLowerCase();
    }

    public static void main(String[] args) {
        File jpgImageFile = new File("/Users/xuanchi.lyf/Desktop/test.png");
        byte[] bytes = readFileTenBytes(jpgImageFile);
        if (bytes == null) {
            return;
        }
        System.out.println(toHexString(bytes));
    }

}

常用的图片魔数有下面这些:
图片说明

zhangpan_soft
zhangpan_soft 正解
大约一年之前 回复

把问号后面的字符串截取掉就是正常连接

zhangpan_soft
zhangpan_soft 回复qq_40838030: 1楼回答就是正解,流本身就可以判定格式,通过url判定是不可取的,就给你打个比方,我一个jpg文件,我去后缀保存,你敢说我这不是个图片么?我用流格式访问之后,一样完全可以正常显示为图片,因为在二进制流里面就包含这个文件的所有信息,所以其就是一张图片,1楼用流判定是 完全正确的,你不论理解与不理解拿上去用就ok了
大约一年之前 回复
qq_35235940
听楼一夜雨 也可以通过图片Data数据第一个字节 来获取图片扩展名
大约一年之前 回复
qq_35235940
听楼一夜雨 mmbiz_jpg
大约一年之前 回复
qq_40838030
从小我就黑 我要的是图片的格式 因为要保存到本地 图片链接我都可以处理的 就是获取不到图片的格式
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

0
ie浏览器运行java中的打印预览出错?
2
SpringSecurity+CAS 明明登录了,但是在corf跨域访问后台获取用户名,得到的总是匿名用户?
4
JDBC连接Mysql出现问题!
1
# Java如何获取指定URL页面所提交的内容?
2
java的空指针问题,各位大佬帮帮忙啊?
2
如何在java里调用使用get方法,参数以application/x-www-form-urlencoded方式传递的web接口?
4
java后端调用Post请求在地址后面加参数 抛异常
0
ftp4j 获取list列表 偶尔报错it.sauronsoftware.ftp4.FTPIllegalReplyException
2
通过C++/java socket向服务器端传递字符串并接收服务器的反馈字符串与使用浏览器实现相同功能有何区别?
0
mariadb数据库乱码,如何解决。
5
连接池:为什么方法结束之后,连接池中所有链接都结束了???
3
写了一个propertie配置文件,测试的时候曝出 Communications link failure错误
4
我要疯了,写个DBUTils连接池这么难?调用配置文件测试连接报noullpointerException
4
通过JAVA按钮事件更新数据库内数据,同时动态的刷新窗口内显示的数据
1
怎样连接腾讯自家的redis产品啊?把我困扰好几天了。就是连接不上,连接超时?
2
SSM 项目部署到 阿里云 linux 服务器上 运行jar包就报错 maxActive can't not set zero
0
MOdbus 的 RTU连接报错
2
springboot 整合mybatis 报错提示包扫描不进去
1
kettle连接SAP hana数据库问题
2
HttpServletRequest request .getSession() 报错,报错内容是获取不到Redis连接