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

news2025/3/11 13:53:06
【需求】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.coloradmin.cn/o/2313247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏引擎学习第149天

今日回顾与计划 在今天的直播中,我们将继续进行游戏的开发工作,目标是完成资产文件(pack file)的测试版本。目前,游戏的资源(如位图和声音文件)是直接从磁盘加载的,而我们正在将其转…

PyCharm 接入 DeepSeek、OpenAI、Gemini、Mistral等大模型完整版教程(通用)!

PyCharm 接入 DeepSeek、OpenAI、Gemini、Mistral等大模型完整版教程(通用)! 当我们成功接入大模型时,可以选中任意代码区域进行解答,共分为三个区域,分别是选中区域、提问区域以及回答区域,我…

升级到碳纤维齿轮是否值得?

引言:当齿轮开始“减肥” 在F1赛车的变速箱里,一个齿轮的重量减轻100克,就能让圈速提升0.1秒; 在无人机旋翼传动系统中,轻量化齿轮可延长续航时间15%; 甚至在高端机械腕表中,碳纤维齿轮的引入…

基于SpringBoot+Vue的瑜伽课体验课预约系统【附源码】

基于SpringBootVue的瑜伽课体验课预约系统 一、系统技术说明二、运行说明三、系统的演示四、系统的核心代码演示 一、系统技术说明 框架:SpringbootVue 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软…

文章被检测出是AI写的怎么办?

随着人工智能技术的飞速发展,AI辅助写作工具逐渐普及,为学生、科研人员以及创作者带来了诸多便利。然而,随之而来的是对学术诚信和内容原创性的担忧。当文章被检测出是AI写作时,应该如何应对?本文将探讨这一问题&#…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14基础固定表头示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

【英伟达AI论文】多模态大型语言模型的高效长视频理解

摘要:近年来,基于视频的多模态大型语言模型(Video-LLMs)通过将视频处理为图像帧序列,显著提升了视频理解能力。然而,许多现有方法在视觉主干网络中独立处理各帧,缺乏显式的时序建模,…

[Lc10_hash] 总结 | 两数之和 | 字符重排 | 存在重复元素 i ii | 字母异位词分组

目录 1.介绍 2.两数之和 题解 3.面试题 01.02. 判定是否互为字符重排 题解 4.存在重复元素 题解 5.存在重复元素 II 题解 ⭕6.字母异位词分组 题解 1.介绍 哈希表是什么? 存储数据的容器前文:[C_] set | map | unordered_map 有什么用呢?…

缓存之美:Guava Cache 相比于 Caffeine 差在哪里?

大家好,我是 方圆。本文将结合 Guava Cache 的源码来分析它的实现原理,并阐述它相比于 Caffeine Cache 在性能上的劣势。为了让大家对 Guava Cache 理解起来更容易,我们还是在开篇介绍它的原理: Guava Cache 通过分段(…

小组件适配屏幕主题色

iOS 18 新增Home screen Tint Color(色调)选择,用户可以通过以下方式自定义主屏幕颜色,并且小组件,APP 图标也会跟随改颜色。 比如说意料之外的小组件(不兼容) 白色部分内部应该还有其他显示内…

IO学习---->线程

1.创建两个线程&#xff0c;分支线程1拷贝文件的前一部分&#xff0c;分支线程2拷贝文件的后一部分 #include <head.h> sem_t sem; long half_size 0; // 全局变量&#xff0c;供所有线程共享void* product(void *arg) {FILE *src fopen("IO.text", "…

个人记录,Unity资源解压和管理插件

就是经典的两个AssetStudio 和 Ripper 没有什么干货&#xff0c;就是记录一下&#xff0c;内容没有很详细 AssetStudio 说错了&#xff0c;AssetStudio比较出名&#xff08;曾经&#xff09;&#xff0c;但好像堕落了 这个工具有个好处就是分类选择&#xff0c;&#xff08;…

day19-前端Web——Vue3+TS+ElementPlus

目录 1. Vue工程化1.1 介绍1.2 环境准备1.2.1 NodeJS安装双击安装包选择安装目录验证NodeJS环境变量配置npm的全局安装路径 1.3 Vue项目-创建1.4 Vue项目开发流程1.5 API风格1.6 案例 2. TS2.1 概述2.2 快速入门2.3 常用类型2.3.1 基础类型2.3.2 联合类型2.3.3 函数类型2.3.4 对…

隐私保护在 Facebook 用户身份验证中的应用

在这个数字化的时代&#xff0c;个人隐私保护成为了公众关注的焦点。社交媒体巨头 Facebook 作为全球最大的社交平台之一&#xff0c;拥有数十亿用户&#xff0c;其在用户身份验证过程中对隐私保护的重视程度直接影响着用户的安全感和信任度。本文将探讨 Facebook 在用户身份验…

【JavaWeb学习Day23】

Maven高级 分模块设计与开发 分模块设计&#xff1a;将一个大项目分成若干个子模块&#xff0c;方便项目的维护、扩展&#xff0c;也方便模块间的相互引用&#xff0c;资源共享。 策略&#xff1a; 1.策略一&#xff1a;按照功能模块拆分&#xff0c;比如&#xff1a;公共组…

个人记录的一个插件,Unity-RuntimeMonitor

没有什么干货,仅仅是个人的记录 基于GUI做的一个工具:好处就是Monitor必须,Unity天然支持实时的Monitor;唯一不好处,就是默认字体太小了,layout居中,居右也是要自行设计的。 (下面文字是有一点点写错,但意思和功能就很牛逼了;并不是都按2 x shift,而是一个 shift 添…

【NexLM 开源系列】如何封装多个大模型 API 调用

&#x1f31f; 在这系列文章中&#xff0c;我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程&#xff0c;从 架构设计 到 代码实战&#xff0c;逐步搭建一个支持 多种大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成与管理平台&#xff…

Git和GitHub基础教学

文章目录 1. 前言2. 历史3. 下载安装Git3.1 下载Git3.2 安装Git3.3 验证安装是否成功 4. 配置Git5. Git基础使用5.1 通过Git Bash使用5.1.1 创建一个新的仓库。5.1.1.1 克隆别人的仓库5.1.1.2 自己创建一个本地仓库 5.1.2 管理存档 5.2 通过Visual Studio Code使用 6. Git完成远…

笔记六:单链表链表介绍与模拟实现

在他一生中&#xff0c;从来没有人能够像你们这样&#xff0c;以他的视角看待这个世界。 ---------《寻找天堂》 目录 文章目录 一、什么是链表&#xff1f; 二、为什么要使用链表&#xff1f; 三、 单链表介绍与使用 3.1 单链表 3.1.1 创建单链表节点 3.1.2 单链表的头插、…

坐落于杭州的电商代运营公司品融电商

坐落于杭州的电商代运营公司品融电商 在中国电商行业蓬勃发展的浪潮中&#xff0c;品融电商&#xff08;PINKROON&#xff09;作为一家扎根杭州的新锐品牌管理公司&#xff0c;凭借其独特的全域增长方法论和实战经验&#xff0c;迅速崛起为行业标杆。自2020年成立以来&#x…