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);
}