From 40b2f45e669e3e29d9514939556c4c69eb560836 Mon Sep 17 00:00:00 2001 From: liux <963924687@qq.com> Date: Sun, 4 Jan 2026 15:35:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E4=B8=8B=E8=BD=BD=E7=BA=BF?= =?UTF-8?q?=E4=B8=8A=E4=BA=BA=E5=91=98=E5=A4=B4=E5=83=8F=E5=88=B0=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0F:\\Users\\Images=20=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/SysUserController.java | 16 +- .../bonus/system/service/ISysUserService.java | 2 + .../service/impl/SysUserServiceImpl.java | 154 +++++++++++++++++- 3 files changed, 170 insertions(+), 2 deletions(-) diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/controller/SysUserController.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/controller/SysUserController.java index 28d7598..d14b806 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/controller/SysUserController.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/controller/SysUserController.java @@ -24,6 +24,7 @@ import com.bonus.system.api.domain.SysUser; import com.bonus.system.api.model.LoginUser; import com.bonus.system.domain.UserPasswordHistory; import com.bonus.system.service.*; +import com.bonus.system.utils.FileCommonUtils; import com.bonus.system.warning.WebSocketHandler; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -96,6 +97,18 @@ public class SysUserController extends BaseController { return getDataTableError(new ArrayList<>()); } + @PostMapping("/downloadUserPhoto") + @SysLog(title = "用户管理", businessType = OperaType.QUERY, logType = 0, module = "系统管理->用户管理", details = "查询用户列表") + public AjaxResult downloadUserPhoto() { + try { + userService.downloadUserPhoto(); + return success(); + } catch (Exception e) { + logger.error(e.toString(), e); + } + return error(); + } + @RequiresPermissions("system:user:export") @PostMapping("/export") @SysLog(title = "用户管理", businessType = OperaType.EXPORT, logType = 0, module = "系统管理->用户管理", details = "导出用户信息") @@ -304,7 +317,8 @@ public class SysUserController extends BaseController { if (StringUtils.isNotNull(userId)) { SysUser sysUser = userService.selectUserById(userId); sysUser.setPassword(null); - sysUser.setPhotoUrl(remoteFileService.getFullFileUrl(sysUser.getPhotoUrl())); + // sysUser.setPhotoUrl(remoteFileService.getFullFileUrl(sysUser.getPhotoUrl())); + sysUser.setPhotoUrl(remoteFileService.getFullFileUrl(FileCommonUtils.getFullFileUrl(sysUser.getPhotoUrl()))); ajax.put(AjaxResult.DATA_TAG, sysUser); ajax.put("postIds", postService.selectPostListByUserId(userId)); ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/service/ISysUserService.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/service/ISysUserService.java index a081e27..774ea94 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/service/ISysUserService.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/service/ISysUserService.java @@ -246,4 +246,6 @@ public interface ISysUserService { SysUser getDeviceStaffInfoBySn(String photoNumber); + + void downloadUserPhoto(); } diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/service/impl/SysUserServiceImpl.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/service/impl/SysUserServiceImpl.java index 29bc9b7..43370a0 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/service/impl/SysUserServiceImpl.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/service/impl/SysUserServiceImpl.java @@ -1,6 +1,5 @@ package com.bonus.system.service.impl; -import com.bonus.common.core.constant.Constants; import com.bonus.common.core.constant.UserConstants; import com.bonus.common.core.domain.R; import com.bonus.common.core.enums.UserPermanentEnum; @@ -41,6 +40,13 @@ import javax.annotation.Resource; import javax.validation.Validator; import java.util.*; import java.util.stream.Collectors; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.List; + /** * 用户 业务层处理 @@ -135,6 +141,152 @@ public class SysUserServiceImpl implements ISysUserService { } + @Override + public void downloadUserPhoto() { + SysUser u = new SysUser(); + List userList = this.selectUserList(u); + // 保存目录 + String saveDir = "F:\\Users\\Images"; + batchDownloadImages(userList,saveDir); + } + + public static void batchDownloadImages(List userList, String saveDir) { + int successCount = 0; + int totalCount = userList.size(); + + System.out.println("开始批量下载,共" + totalCount + "个图片..."); + + for (int i = 0; i < totalCount; i++) { + String url = userList.get(i).getPhotoUrl(); + if(url ==null){ + continue; + }else{ + url = url.replace("http://192.168.20.242:9000/","http://192.168.20.234:9090/"); + } + String fileName = "image_" + userList.get(i).getUserId()+"_"+userList.get(i).getNickName(); // 生成文件名 + + if (downloadImage(url, saveDir, fileName)) { + successCount++; + } + + // 避免请求过快,可根据需要调整 + try { + Thread.sleep(100); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + System.out.println("下载完成!成功: " + successCount + "/" + totalCount); + } + + /** + * 下载单个图片 + * @param imageUrl 图片URL地址 + * @param saveDir 保存目录 + * @param fileName 保存的文件名(不含扩展名) + * @return 下载成功返回true,否则返回false + */ + public static boolean downloadImage(String imageUrl, String saveDir, String fileName) { + try { + // 创建URL对象 + URL url = new URL(imageUrl); + + // 打开连接 + URLConnection connection = url.openConnection(); + connection.setConnectTimeout(5000); + connection.setReadTimeout(10000); + connection.setRequestProperty("User-Agent", "Mozilla/5.0"); + + // 获取文件扩展名 + String fileExtension = getFileExtension(imageUrl); + if (fileExtension.isEmpty()) { + // 尝试从Content-Type获取扩展名 + String contentType = connection.getContentType(); + fileExtension = getExtensionFromContentType(contentType); + } + + // 构建保存路径 + String savePath = saveDir + File.separator + fileName + fileExtension; + + // 确保目录存在 + File dir = new File(saveDir); + if (!dir.exists()) { + dir.mkdirs(); + } + + // 下载文件 + try (InputStream in = connection.getInputStream(); + FileOutputStream out = new FileOutputStream(savePath)) { + + byte[] buffer = new byte[4096]; + int bytesRead; + + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + + System.out.println("下载成功: " + fileName + fileExtension); + return true; + } + + } catch (Exception e) { + System.err.println("下载失败: " + fileName + " - " + e.getMessage()); + return false; + } + } + + /** + * 从Content-Type获取文件扩展名 + */ + private static String getExtensionFromContentType(String contentType) { + if (contentType == null) { + return ".jpg"; // 默认扩展名 + } + + switch (contentType.toLowerCase()) { + case "image/jpeg": + return ".jpg"; + case "image/png": + return ".png"; + case "image/gif": + return ".gif"; + case "image/bmp": + return ".bmp"; + case "image/webp": + return ".webp"; + default: + return ".jpg"; + } + } + + /** + * 从URL获取文件扩展名 + */ + private static String getFileExtension(String url) { + String[] imageExtensions = {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"}; + + for (String ext : imageExtensions) { + if (url.toLowerCase().contains(ext)) { + return ext; + } + } + + // 尝试从URL路径获取 + int lastSlash = url.lastIndexOf('/'); + int lastDot = url.lastIndexOf('.'); + + if (lastDot > lastSlash && lastDot > 0) { + String possibleExt = url.substring(lastDot); + // 检查是否是合理的图片扩展名 + if (possibleExt.length() <= 5) { // 扩展名通常不超过5个字符 + return possibleExt; + } + } + + return ""; + } + public List selectUserList4Job(SysUser user) { return userMapper.selectUserList(user); }