从小我就黑 2018-09-14 06:43 采纳率: 75%
浏览 5265
已采纳

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

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

  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条回答 默认 最新

  • 玄尺 2018-09-14 12:10
    关注

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

     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));
        }
    
    }
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?