java 将本地图片批量上传到oss服务

上段时间在后台搞了一个图片上传的功能,但是由于项目上传的图片量过大,如果用后台上传效率较慢,所以搞了一个程序直接从把本地的图片上传的oss。

import com.alibaba.fastjson.JSON;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;

public class UploadResource {

    /**
     * 图片路径
     */
    private final static String IMG_PATH = "XXX";

    /**
     * oss 文件路径
     */
    private static final String VIEW_PATH = "XXX";

    /**
     * oss ENDPOINT
     */
    private static final String ENDPOINT = "XXX";
    
    /**
     * oss ACCESS_KEY_ID
     */
    private static final String ACCESS_KEY_ID = "XXX";

    /**
     * oss ACCESS_KEY_SECRET
     */
    private static final String ACCESS_KEY_SECRET = "XXX";

    /**
     * oss BUCKET_NAME
     */
    private static final String BUCKET_NAME = "XXX";

    /**
     * 创建oss client
     */
    private static OSS OSS_CLIENT = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

    private static List<String> IMAGE_TYPE = new ArrayList<String>();

    static {
        IMAGE_TYPE.add(".jpg");
        IMAGE_TYPE.add(".jpeg");
        IMAGE_TYPE.add(".png");
    }

    /**
     * 上传图片
     *
     * @date 2020/9/1 10:30
     */
    public static void uploadImg(String path) {

        // path为空,则读取F:\image 目录下的图片
        if (path == null || "".equals(path.trim())) {
            path = "F:\\image";
        }

        // 上传到目录结构有两层, 因为我的需求上传图片以图集为单位,所以path路径下每个文件夹为一个图集,文件夹是对应图集的图片
        File file = new File(path);
        File[] fs1 = file.listFiles();

        // 保存每个图集的url
        List<Map<Integer, String>> resourceList = new ArrayList<Map<Integer, String>>();
        Map<Integer, String> resourceMap;
        String type;
        UUID uuid;
        String randomStr;
        String fileName;
        String uploadPath;

        Long startTime = System.currentTimeMillis();
        System.out.println(" ================== >>> upload start ...");

        int count = 1;
        float total = fs1.length;

        try {
            // 遍历该路径下的文件夹
            for (File f1 : fs1) {

                // 该文件不是目录则跳过
                if (!f1.isDirectory()) {
                    continue;
                }

                resourceMap = new HashMap<Integer, String>();
                int i = 1;
                // 遍历改文件夹中的文件
                for (File f2 : f1.listFiles()) {

                    // 到第二层文件夹下,则要判断file是否为文件,如果不是则跳过
                    if (f2.isDirectory()) {
                        continue;
                    }

                    // 获取素材类型
                    type = f2.getName().substring(f2.getName().lastIndexOf("."));

                    // 判断素材类型不是图片则跳过该循环
                    if (!IMAGE_TYPE.contains(type)) {
                        continue;
                    }

                    // 生成素材名称
                    uuid = UUID.randomUUID();
                    randomStr = uuid.toString().substring(0, 16);
                    fileName = getCurrentDay() + "_" + randomStr + type;
                    uploadPath = IMG_PATH + "/" + getCurrentDay() + "/" + fileName;

                    // 上传至oss
                    OSS_CLIENT.putObject(BUCKET_NAME, uploadPath, f2);

                    // 生成oss 访问的url
                    String imgUrl = VIEW_PATH + uploadPath;
                    // 暂存的集合中
                    resourceMap.put(i++, imgUrl);
                }
                resourceList.add(resourceMap);
                System.out.println(" ================== >>>  " + (int) (Float.valueOf(count) / total * 100) + " %");
                count++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //TODO 当上传成功以后可以将 resourceList 里的数据持久化到数据库,可以连数据库也可以用远程调用接口


        System.out.println(JSON.toJSON(resourceList).toString());
        System.out.println(" ================== >>> upload end !!!  run time: " + ((System.currentTimeMillis() - startTime) / 1000) + " s");
    }

    public static String getCurrentDay() {
        return new SimpleDateFormat("yyyyMMdd").format(new Date());
    }

    public static void main(String[] args) {
        String filePath = null;
        if (args.length > 0) {
            filePath = args[0];
        }
        uploadImg(filePath);
    }
}

 我这面上传图片的目录结构

 

上述代码可以直接在开发工具中运行,也可以达成jar包运行

我这个是maven项目,所在在pom.xml 配置指定main方法入口

 <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <!-- 此处指定main方法入口的class -->
                            <mainClass>upload.UploadResource</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>assembly</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

到该项目根目录中运行 : mvn package

找到该jar包 ,执行命令  java -jar uploadResource-1.0-SNAPSHOT.jar

如果要指定目录的话,则在后面加上目录的参数,比如说要上传F:\test  目录中下文件

java -jar uploadResource-1.0-SNAPSHOT.jar "F:\test"

可以使用阿里云提供的Java SDK来实现批量上传图片OSS。 首先,需要在项目中引入阿里云Java SDK的依赖,可以在Maven中添加以下依赖: ```xml <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> ``` 接着,可以编写上传图片的代码。以下是一个基本的示例: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectResult; public class BatchUploadToOSS { public static void main(String[] args) { String endpoint = "your_endpoint"; // OSS服务端点 String accessKeyId = "your_access_key_id"; // AccessKeyId String accessKeySecret = "your_access_key_secret"; // AccessKeySecret String bucketName = "your_bucket_name"; // 存储空间名称 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); List<String> fileNames = new ArrayList<>(); // 需要上传的文件路径列表 fileNames.add("path/to/file1.jpg"); fileNames.add("path/to/file2.jpg"); fileNames.add("path/to/file3.jpg"); for (String fileName : fileNames) { File file = new File(fileName); InputStream inputStream; try { inputStream = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); continue; } PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream); PutObjectResult result = ossClient.putObject(putObjectRequest); System.out.println("上传文件 " + fileName + " 成功,文件URL:" + result.getETag()); } ossClient.shutdown(); } } ``` 以上代码会将指定目录下的多个文件批量传到OSS,并输出每个文件的URL。需要将`your_endpoint`、`your_access_key_id`、`your_access_key_secret`和`your_bucket_name`替换为自己的实际信息。 注意,以上代码中的文件名需要包含文件扩展名。例如,如果需要上传的文件名为`image01`,那么应该将其改为`image01.jpg`或`image01.png`等带有文件扩展名的名称。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值