SAZA 2025-01-09 09:19 采纳率: 0%
浏览 6

HttpURLConnection 线上异常

这边写了个图片下载到ex模板的方法,本地调试的正常,为什么线上就不行了,希望大家解答一下
线上报500,java.io.ioexception: server returned http response code: 500 for url:

        public byte[] downloadImage(String imageUrl) {
//        //userfiles/附件//11/截图 2024-10-10 23115420241126205145.png
        String fullUrl = null;
        try {
            // 对URL进行编码
            // 分离路径和查询参数
            int queryIndex = imageUrl.indexOf('?');
            String baseUrl = (queryIndex == -1) ? imageUrl : imageUrl.substring(0, queryIndex);
            String queryParams = (queryIndex == -1) ? "" : imageUrl.substring(queryIndex + 1);

            // 对查询参数进行编码
            String encodedQueryParams = URLEncoder.encode(queryParams, StandardCharsets.UTF_8.toString());
            fullUrl = baseUrl + (queryParams.isEmpty() ? "" : "?" + encodedQueryParams);
            // 替换空格为 %20
            fullUrl = fullUrl.replace(" ", "%20");
            // 创建URL对象并打开连接
            URL url = new URL(fullUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("User-Agent", "Mozilla/5.0");
            connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");

            // 检查响应码
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                try (InputStream in = connection.getInputStream()) {
                    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                    int nRead;
                    byte[] data = new byte[16384];
                    while ((nRead = in.read(data, 0, data.length)) != -1) {
                        buffer.write(data, 0, nRead);
                    }
                    return buffer.toByteArray();
                }
            } else {
                logger.error("下载图片失败: HTTP响应代码: " + responseCode + " for URL: " + fullUrl);
            }
        } catch (MalformedURLException e) {
            logger.error("URL格式错误: " + fullUrl, e);
        } catch (IOException e) {
            logger.error("下载图片失败: " + fullUrl, e);
        } catch (Exception e) {
            logger.error("未知错误: " + fullUrl, e);
        }
        return null;
    }

  • 写回答

2条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-01-09 09:20
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    针对线上报500,java.io.IOException: server returned http response code: 500 for url: 的错误,可能原因如下:
    1. 网络连接问题:线上环境与本地环境连接网络的稳定性有差异,可能导致在线上环境无法正确访问到需要下载的图片链接。
    2. 安全设置问题:线上环境可能存在安全设置导致无法正确访问图片链接,例如防火墙、代理等。
    3. URL格式问题:线上环境中的图片链接格式可能与本地环境不一致,需要检查代码中对URL进行编码和拼接的逻辑是否正确。
    4. 服务器配置问题:线上服务器的配置参数可能有限制,例如最大并发连接数等,可能导致无法正常下载图片。 针对这个问题,可以采取以下解决方案:
    5. 检查线上环境的网络连接情况,确保服务器能够正常访问外部图片链接。
    6. 检查线上环境的安全设置,可能需要调整安全策略以确保能够正确下载图片。
    7. 对线上环境中的图片链接进行详细调试,确认链接格式是否正确,并尝试手动访问图片链接以确认是否能够正常访问。
    8. 根据具体报错信息,进一步排查可能的服务器配置问题,例如检查服务器的并发连接数限制等。 为了更准确地定位问题,可以在代码中增加日志输出,记录实际访问的图片链接以及返回的HTTP响应码,帮助排查问题。以下是对代码的简单修改,添加了日志输出:
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    public byte[] downloadImage(String imageUrl) {
        Logger logger = LoggerFactory.getLogger(getClass());
        String fullUrl = null;
        try {
            // 对URL进行编码
            // 分离路径和查询参数
            int queryIndex = imageUrl.indexOf('?');
            String baseUrl = (queryIndex == -1) ? imageUrl : imageUrl.substring(0, queryIndex);
            String queryParams = (queryIndex == -1) ? "" : imageUrl.substring(queryIndex + 1);
            // 对查询参数进行编码
            String encodedQueryParams = java.net.URLEncoder.encode(queryParams, java.nio.charset.StandardCharsets.UTF_8.toString());
            fullUrl = baseUrl + (queryParams.isEmpty() ? "" : "?" + encodedQueryParams);
            // 替换空格为 %20
            fullUrl = fullUrl.replace(" ", "%20");
            // 创建URL对象并打开连接
            URL url = new URL(fullUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("User-Agent", "Mozilla/5.0");
            connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
            // 检查响应码
            int responseCode = connection.getResponseCode();
            logger.info("HTTP响应代码: " + responseCode + " for URL: " + fullUrl);
            if (responseCode == HttpURLConnection.HTTP_OK) {
                try (InputStream in = connection.getInputStream()) {
                    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                    int nRead;
                    byte[] data = new byte[16384];
                    while ((nRead = in.read(data, 0, data.length)) != -1) {
                        buffer.write(data, 0, nRead);
                    }
                    return buffer.toByteArray();
                }
            } else {
                logger.error("下载图片失败: HTTP响应代码: " + responseCode + " for URL: " + fullUrl);
            }
        } catch (MalformedURLException e) {
            logger.error("URL格式错误: " + fullUrl, e);
        } catch (IOException e) {
            logger.error("下载图片失败: " + fullUrl, e);
        } catch (Exception e) {
            logger.error("未知错误: " + fullUrl, e);
        }
        return null;
    }
    

    通过增加日志输出,在线上环境中可以查看具体访问的图片链接以及返回的HTTP响应码,从而更好地定位问题所在。如果问题仍然存在,建议进一步排查可能的网络连接、安全设置、URL格式和服务器配置等方面的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月9日