访问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();
希望本文可以帮到你。