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

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

访问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();

希望本文可以帮到你。

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

在解决 `java.io.FileNotFoundException: No content provider` 错误时,不同场景有不同的解决思路。 有开发者遇到类似错误后,错误信息里出 “No content provider” 字眼,就往实 `content provider` 方向去找问题,但没有解决问题 [^1]。这表明不能盲目地认为是缺少 `content provider` 而直接去实它。 对于 `MediaPlayer` 出该错误的情况,可添加 `MediaPlayer.OnInfoListener` 监听,在回调方法中打印 `what`,并参照 `MediaPlayer` 提供的类型进行对比。例如 `MediaPlayer: Couldn't open java.io.FileNotFoundException: No content provider` 错误对应的是 801,类型为 `MediaPlayer.MEDIA_INFO_NOT_SEEKABLE`(无法获取媒资),通过这种方式可以进一步定位问题 [^2]。 同时,有开发者调用系统播放器时在部分手机(华为 vivo)上出黑屏、视频无法播放且报该错误的情况,而在小米手机上正常。这说明可能存在不同手机系统对播放的兼容性问题,需要进一步排查不同手机系统的特性限制 [^3]。 另外,当使用 `MediaPlayer` 播放网络音频出该错误时,有开发者表示此问题无法修复。原代码如下: ```java /** * 播放音频文件 */ private void playVoice(String voicePath){ MediaPlayer player = MediaPlayer.create(context, Uri.parse(voicePath)); player.start(); } ``` 这可能暗示在使用 `MediaPlayer` 播放网络资源时,该错误可能是由于网络资源访问、权限或者 `MediaPlayer` 本身对网络资源处理的局限性导致的 [^4]。 综合来看,解决此错误可按以下步骤尝试: 1. 不要盲目实 `content provider`,先通过添加 `MediaPlayer.OnInfoListener` 监听来进一步定位错误类型。 2. 检查网络连接资源权限,确保可以正常访问网络资源。 3. 考虑不同手机系统的兼容性问题,针对不同系统进行测试适配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值