You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java调用openStream下载图片URL超时 同机浏览器可正常访问

问题描述

受公司政策限制,无法分享完整代码,当前运行失败的代码片段如下:

try(InputStream in = new URL("URL with image file").openStream()){
    Files.copy(in, Paths.get("file://newfile.png"));
} catch (Exception e) {
}

代码运行抛出的异常信息为:

java.net.ConnectException: Connection timed out: connect

已尝试排查方案

  • 调用openStream方法前配置代理及对应端口号
  • 为请求添加User-Agent标识
  • 直接加载系统代理配置

补充场景信息

核心需求为从目标URL下载保存图片文件,当前测试结果:

  • 目标URL在个人设备上可正常访问
  • 公司设备上,即便配置了代理,上述代码依然无法访问目标URL
  • 同一台公司设备上,通过浏览器可以正常打开该URL

根本原因

核心问题是Java进程没有正确接入公司网络的合法代理通道:

  1. 公司出口代理普遍存在域账号认证、PAC自动分流规则、NTLM认证要求,浏览器默认会自动读取系统代理配置、自动完成认证流程,所以可以正常访问外网资源。
  2. 你之前配置的代理仅填写了地址和端口,要么没有携带代理要求的身份认证信息,要么没有匹配PAC分流规则(多数公司不会让所有流量走固定代理,外网资源才走代理通道,直连外网的请求会直接被防火墙拦截),Java发起的请求实际没有经过合法代理,直接被拦截才会触发连接超时。
  3. 额外注意:你代码里的保存路径写法存在隐患,Paths.get()接收本地文件系统路径时不需要加file://协议头,这个问题不会触发连接超时,但会导致后续文件保存失败。

解决方案
  1. 先从浏览器代理设置页确认公司代理的真实规则:是固定代理+账号认证,还是PAC自动脚本代理,记录准确的代理地址、端口、认证要求。
  2. 给Java进程配置匹配规则的代理参数:
    • 如果是无认证的HTTP/HTTPS代理,启动JVM时添加如下参数,注意HTTP和HTTPS代理都要配置:
      -Dhttp.proxyHost=代理地址 -Dhttp.proxyPort=代理端口 -Dhttps.proxyHost=代理地址 -Dhttps.proxyPort=代理端口
      
    • 如果是需要账号密码认证的代理,在发起请求前添加认证配置,填入公司域账号和对应密码:
      Authenticator.setDefault(
        new Authenticator() {
          @Override
          protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("你的域账号", "代理密码".toCharArray());
          }
        }
      );
      
    • 如果是PAC自动代理模式,不要硬编码固定代理地址,使用PAC解析库读取脚本规则,匹配目标URL对应的代理节点后再发起请求。
  3. 修正文件保存路径,去掉file://前缀,直接写本地路径比如Paths.get("./newfile.png"),如果要使用URI格式的路径,需要用Paths.get(URI.create("file://newfile.png"))做转换。
  4. 调试阶段不要吞掉异常,在catch块打印完整异常栈,方便定位是连接阶段还是认证阶段出的问题。

内容的提问来源于stack exchange,提问作者Clinton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:06:35