大量文件夹内含图片提取阿里云CDN图片Url

点击查看代码
package org.example;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class ImageUploader {
    // 阿里云OSS配置
    private static final String ENDPOINT = "ENDPOINT";
    private static final String ACCESS_KEY_ID = "ACCESS_KEY_ID";
    private static final String ACCESS_KEY_SECRET = "ACCESS_KEY_SECRET";
    private static final String BUCKET_NAME = "BUCKET_NAME";
    private static final String OSS_DOMAIN = "https://" + BUCKET_NAME + "." + ENDPOINT;
    private static final String CDN_DOMAIN = "CDN_DOMAIN";

    public static void main(String[] args) {
        // 本地文件夹路径(包含多个子文件夹)
        String localRootPath = "本地文件夹路径";

        // 云服务器上的根目录
        String ossRootPath = "images/";

        // 初始化OSS客户端
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

        try {
            // 遍历本地根目录下的所有子文件夹
            Files.list(Paths.get(localRootPath))
                    .filter(Files::isDirectory)
                    .forEach(folder -> processFolder(ossClient, folder, ossRootPath));

            System.out.println("  所有图片上传完成!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭OSS客户端
            ossClient.shutdown();
        }
    }

    private static void processFolder(OSS ossClient, Path folderPath, String ossRootPath) {
        String folderName = folderPath.getFileName().toString();
        List<String> imageUrls = new ArrayList<>();

        try {
            // 1. 上传文件夹中的所有图片
            Files.list(folderPath)
                    .filter(file -> isImageFile(file.toString()))
                    .forEach(imageFile -> {
                        String objectName = ossRootPath + folderName + "/" + imageFile.getFileName().toString();
                        String imageUrl = uploadFileToOSS(ossClient, imageFile.toFile(),  objectName);
                        if (imageUrl != null) {
                            imageUrls.add(imageUrl);
                        }
                    });

            // 2. 创建包含图片URL的txt文件
            if (!imageUrls.isEmpty())  {
                createUrlTxtFile(folderPath, imageUrls);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String uploadFileToOSS(OSS ossClient, File file, String objectName) {
        try {
            // 上传文件到OSS
            ossClient.putObject(new  PutObjectRequest(BUCKET_NAME, objectName, file));

            // 返回文件的访问URL
            return OSS_DOMAIN + "/" + objectName;
        } catch (Exception e) {
            System.err.println("  上传文件失败: " + file.getName());
            e.printStackTrace();
            return null;
        }
    }

    private static void createUrlTxtFile(Path folderPath, List<String> urls) {
        File txtFile = new File(folderPath.toString(),  "image_urls.txt");
        try (FileWriter writer = new FileWriter(txtFile)) {
            for (String url : urls) {
                // 替换域名
                String cdnUrl = url.replace(OSS_DOMAIN,  CDN_DOMAIN);
                writer.write(cdnUrl  + System.lineSeparator());
            }
            System.out.println("  已创建URL文件: " + txtFile.getAbsolutePath());
        } catch (IOException e) {
            System.err.println("  创建URL文件失败: " + txtFile.getName());
            e.printStackTrace();
        }
    }

    private static boolean isImageFile(String fileName) {
        String[] imageExtensions = {".jpg", ".jpeg", ".png", ".gif", ".bmp"};
        fileName = fileName.toLowerCase();
        for (String ext : imageExtensions) {
            if (fileName.endsWith(ext))  {
                return true;
            }
        }
        return false;
    }
}
-------------------我是一条可爱的分割线--------------- 以下是效果图展示:

posted @ 2025-05-15 16:15  Ghost#  阅读(44)  评论(0)    收藏  举报