当前位置: 首页 > news >正文

Java本地方法根据线上地址下载图片到本地然后返回本地可以访问的地址

【需求】A和B两台服务器,A是云服务器,B是本地服务器,A和B上部署了一模一样的springboot代码,代码分为前后端,其中在B上前端请求先请求B的后端然后B转发到A的后端,然后A返回给B,B再返回给B的前端,其中有这样一个要求,当A中返回的有图片地址,
eg:https://img2.baidu.com/it/u=3291591322,3298476114&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1741712400&t=0eb7f02bddaf552d7ae9f89d94f31f6e,B需要把这个图片download下来,然后放到D:\file路径下 然后返回可以访问的url
入参是待下载的图片地址(https://img2.baidu.com/it/u=3291591322,3298476114&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1741712400&t=0eb7f02bddaf552d7ae9f89d94f31f6e)  
返回是本地下载后的图片预览地址

代码如下:

1.首先写一个工具类

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Paths;
import java.util.UUID;

public class ImageDownloadUtils {

    // 本地存储根目录(按需求修改)
    private static final String LOCAL_BASE_PATH = "D:\\file\\";
    
    // B服务器访问前缀(根据实际IP/域名和端口配置)
    private static final String SERVER_URL_PREFIX = "http://ip:7075/"; 

    /**
     * 下载远程图片并返回本地可访问URL
     * @param imageUrl 待下载的图片地址
     * @return 本地预览地址
     */
    public static String downloadAndGetLocalUrl(String imageUrl) {
        try {
            // 1. 创建存储目录
            File saveDir = new File(LOCAL_BASE_PATH);
            if (!saveDir.exists()) saveDir.mkdirs();

            // 2. 生成唯一文件名(避免重复)
            String fileExt = getFileExtension(imageUrl);
            String fileName = UUID.randomUUID() + "." + fileExt;
            
            // 3. 下载文件
            String localPath = LOCAL_BASE_PATH + fileName;
            downloadImage(imageUrl, localPath);
            
            // 4. 返回可访问URL
            return SERVER_URL_PREFIX + fileName;
            
        } catch (Exception e) {
            throw new RuntimeException("图片下载失败: " + e.getMessage(), e);
        }
    }

    /**
     * 从URL获取文件扩展名
     */
    private static String getFileExtension(String url) {
        try {
            String path = new URL(url).getPath();
            int dotIndex = path.lastIndexOf('.');
            return (dotIndex == -1) ? "png" : path.substring(dotIndex + 1);
        } catch (Exception e) {
            return "png"; // 默认png格式
        }
    }

    /**
     * 下载图片到本地
     */
    private static void downloadImage(String imageUrl, String savePath) throws IOException {
        URL url = new URL(imageUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setReadTimeout(30000);
        
        try (InputStream is = conn.getInputStream();
             FileOutputStream fos = new FileOutputStream(savePath)) {
            
            byte[] buffer = new byte;
            int len;
            while ((len = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
        } finally {
            conn.disconnect();
        }
    }
}

2.自己在电脑上装一个nginx,路径指定到D:\file, 

返回地址:http://ip:7075/图片名称

nginx配置如下:

server{
	listen  7075;
   	server_name  域名 ip;


	location / {

		root D:\file;

	}

}

3.demo

public static void main(String[] args) {
        String originUrl = "https://img2.baidu.com/it/u=3291591322,3298476114&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1741712400&t=0eb7f02bddaf552d7ae9f89d94f31f6e";
        String localUrl = ImageDownloadUtils.downloadAndGetLocalUrl(originUrl);
        System.out.println("localUrl = " + localUrl);
    }

http://www.dtcms.com/a/61301.html

相关文章:

  • 【氮化镓】开态GaN HEMTs中氧诱导Vth漂移的缺陷演化
  • 力扣:找到一个数字的 K 美丽值(C++)
  • 面试题之强缓存协商缓存
  • javascript-es6 (六)
  • 从机器学习到生成式AI狂潮:AWS的AI征程从未停息
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-7.2.2自动扩缩容策略(基于HPA)
  • 2025年总结zabbix手动部署过程!
  • 【Python爬虫】使用python脚本拉取网页指定小说章节
  • [250310] Mistral 发布世界领先的文档理解 API:Mistral OCR | 谷歌利用 AI 保护自然的三种新方式
  • 可视化图解算法:反转链表
  • 《面向长尾分布的甲骨文识别算法设计与实现 》开题报告
  • 力扣hot100二刷——哈希、双指针、滑动窗口
  • C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用
  • 【gcc编译以及Makefile与GDB调试】
  • python LLM工具包
  • JavaScript数据类型和内存空间
  • 20-智慧社区物业管理平台
  • Java【多线程】(3)单例模式与线程安全
  • 大模型如何从开始到编译出Engine
  • [免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】
  • 一个简化版的进程内通信库实现
  • 深入理解Java中的static关键字及其内存原理
  • 《云原生技术:DeepSeek分布式推理的效能倍增器》
  • Git系列之git checkout
  • 发起请求的步骤
  • Spring Boot整合WebSocket
  • 基于深度学习的中文文本情感分析系统
  • EasyTwin全新体验 | 春启新章,智焕新生
  • 隧道定向号角喇叭为隧道安全保驾护航
  • Microsof Visual Studio Code 安装教程(中文设置)