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"

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值