[问题解决方案]访问oss地址获取图片流出现 java.io.FileNotFoundException和403

本文介绍了在使用Java访问OSS(Object Storage Service)获取摄像头远程抓图时遇到的两个问题:java.io.FileNotFoundException和403错误。问题一是由于图片资源可能尚未准备好,解决方案是通过延迟获取图片流来处理;问题二是请求缺少User-Agent头导致的403,添加相应头即可解决。提供了一段关键代码示例以供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

访问oss获取图片出现 java.io.FileNotFoundException和403解决方案

场景

最近公司跟大华和海康摄像头调试远程抓图的api,什么叫远程抓图,就是我告诉它相机id,它拍个当前相机的图像给我。
我这边拿到第三方的图片url后去下载图片存储到自己这边。可谓是一波三折。

问题一( java.io.FileNotFoundException)

为什么 java.io.FileNotFoundException
因为请求图片时图片资源不存在,才会有这个错。
当时调试的时候我这边查看日志拿到路径在浏览器里面可以直接打开,排查的主要方向放在了请求方式上,反应过来的时候已经好久,固写这篇文章希望可以帮到大家。需要延迟获取图片流的代码也贴在下面。

远程抓图api(大华官方文档有过解释)
由于平台下发抓图指令到设备,设备将图片异步写入此接口返回的地址中,所以此接口获取到的地址,不一定立马能访问到资源;

所以,在调试文档时一定要把接口描述和注意事项看完。

public static InputStream getThisUrlInputStream(String fileUrl, int delatPostCount) {
        InputStream is = null;
        if (delatPostCount == 3) {
            return is;
        }
        try {
            //下载网络文件
            URL url = new URL(fileUrl);
            // 打开连接
            URLConnection con = url.openConnection();
            //设置请求超时为5s
            con.setConnectTimeout(5 * 1000);
            //防止屏蔽程序抓取而返回403错误 不加请求oss的部分路径会403
            con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            try {
                // 输入流
                is = con.getInputStream();
            } catch (FileNotFoundException exception) {
                Thread.sleep(2000L);
                is = getThisUrlInputStream(fileUrl, ++delatPostCount);
                return is;
            }
            if (is.available() == 0) {
                Thread.sleep(2000L);
                is = getThisUrlInputStream(fileUrl, ++delatPostCount);
                return is;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return is;
    }

问题二(请求返回403)

请求时需要加上该参数。
con.setRequestProperty(“User-Agent”, “Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)”);


//下载网络文件
            URL url = new URL(fileUrl);
            // 打开连接
            URLConnection con = url.openConnection();
            //设置请求超时为5s
            con.setConnectTimeout(5 * 1000);
            //防止屏蔽程序抓取而返回403错误 不加请求oss的部分路径会403
            con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
               // 输入流
                is = con.getInputStream();

希望本文可以帮到你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值