[问题解决方案]访问oss地址获取图片流出现 java.io.FileNotFoundException和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();

希望本文可以帮到你。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Spring Boot和OSS存储图片时,可以考虑使用YAML文件来代替application.properties文件。以下是一个示例: 首先,在pom.xml文件中添加如下依赖: ```xml <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> ``` 然后,在application.yml文件中添加以下内容: ```yaml # OSS配置 oss: endpoint: oss-cn-hangzhou.aliyuncs.com access-key-id: your_access_key_id access-key-secret: your_access_key_secret bucket-name: your_bucket_name object-prefix: your_object_prefix ``` 接下来,在Java代码中使用该配置: ```java @Configuration @ConfigurationProperties(prefix = "oss") public class OSSConfig { private String endpoint; private String accessKeyId; private String accessKeySecret; private String bucketName; private String objectPrefix; // 省略getter和setter方法 @Bean public OSSClient ossClient() { return new OSSClient(endpoint, accessKeyId, accessKeySecret); } @Bean public OSSService ossService(OSSClient ossClient) { return new OSSServiceImpl(ossClient, bucketName, objectPrefix); } } ``` 在上述代码中,使用@ConfigurationProperties注解将配置文件中oss前缀的属性注入到OSSConfig类中,然后将OSSClient和OSSService注入到Spring容器中。 最后,在Java代码中使用OSSService将图片上传到OSS: ```java @RestController public class ImageController { @Autowired private OSSService ossService; @PostMapping("/images") public String uploadImage(@RequestParam("file") MultipartFile file) { String fileName = file.getOriginalFilename(); String objectName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(fileName); try { ossService.upload(objectName, file.getInputStream()); return ossService.getObjectUrl(objectName); } catch (IOException e) { throw new RuntimeException("Failed to upload image", e); } } } ``` 在上述代码中,使用@RequestParam注解从HTTP请求中获取上传的图片文件,然后将其上传到OSS中,并返回图片的URL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值