Java程序批量拷贝服务器文件到阿里云OSS

文章讲述了作者如何编写一个全自动程序,解决公司阿里云服务器上文件过多且需拷贝2020年前文件的问题,涉及文件夹结构、OSSClient的使用以及如何将文件从服务器拷贝到阿里云OSS,并提供了两个示例代码片段用于上传和下载文件。
摘要由CSDN通过智能技术生成

        最近遇到一个问题就是公司的阿里云服务器上的文件快把盘给撑爆了,而且监总要求要拷贝2020年前的文件。但是文件特别多,而且搜索文件这方面做了优化(文件夹特别多),所以得编写一个全自动文件拷贝程序。

        公司的文件夹结构形式是这样的

/data0/fastdfs_storage_data/data
    ├── 00
    │   ├── 00
    │   │   ├── (各种图片文件)
    │   ├── 01
    │   │   ├── (各种图片文件)
    │   ├── 02

    │   │   ├── (各种图片文件)
    │   ├── ........(省略)
    ├── 01

    │   ├── ........(省略)
    ├── 02

    │   ├── ........(省略)
    ├── ......(省略)

    ├── FF

例如 /data0/fastdfs_storage_data/data/00/00/文件名1(第一个文件)

         /data0/fastdfs_storage_data/data/00/0A/文件名2

         /data0/fastdfs_storage_data/data/1B/FF/文件名3

         /data0/fastdfs_storage_data/data/FF/FF/文件名4(最后一个文件)

 服务器文件拷贝到阿里云oss

      代码在这:

        先创建一个OssProperties

public class OssProperties {

    // 阿里云oss地址
    private String ossaddress = "";
    // 两个密钥信息
    private String accessKeyId = "";
    private String accessKeySecret = "";
    // 桶名称
    private String bucketName = "";
    // 服务器文件存储地址
    private String filePath = "";

    public String getOssaddress() {
        return ossaddress;
    }

    public void setOssaddress(String ossaddress) {
        this.ossaddress = ossaddress;
    }

    public String getBucketName() {
        return bucketName;
    }

    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }


    public void setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
    }

    public void setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
    }


    public String getAccessKeyId() {
        return accessKeyId;
    }

    public String getAccessKeySecret() {
        return accessKeySecret;
    }
}

然后开始编写文件上传代码

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import entity.OssProperties;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.text.SimpleDateFormat;
import java.util.Date;

public class test {

    static OssProperties ossProperties = new OssProperties();
    final static String IMGADDRESS = ""; // OSS文件目录

    public static void main(String[] args) throws Exception {
        System.out.println("程序启动");
        long startTime = System.currentTimeMillis();
        // 设置运行时间为 5 * 3600 * 1000 毫秒(5个小时)
        long stopTime = 5 * 3600 * 1000;
        System.out.println("开始拷贝...");
        OSSClient client = new OSSClient(ossProperties.getOssaddress(), ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
        for(int i = 0; i < 256; i++) {
            for (int j = 0; j < 256; j++) {
                // 超过指定时间之后直接停止程序
                long endTime = System.currentTimeMillis();
                if (endTime - startTime > stopTime) {
                    System.out.println("拷贝到时,已停止...");
                    // 停止之后计时时间为 19 * 3600 * 1000 毫秒
                    Thread.sleep(19 * 3600 * 1000);
                    startTime = System.currentTimeMillis();
                }

                String a = encodeHEX(i);
                String b = encodeHEX(j);
                System.out.println("在/" + a + '/' + b + "目录下拷贝中...");
                ossProperties.setFilePath(IMGADDRESS + a + '/' + b + '/');
                String flilePathName = "/data0/fastdfs_storage_data/data/" + a + '/' + b + "/"; // 将文件存储到OSS目录的地址
                File file = new File(flilePathName);
                File[] files = file.listFiles();
                if (files == null) {
                    System.out.println(a + '/' + b + "目录为空");
                    continue;
                }
                for (File f : files) {
                    BasicFileAttributes attrs = Files.readAttributes(Paths.get(f.getAbsolutePath()), BasicFileAttributes.class);
                    // 从基本属性类中获取文件创建时间
                    FileTime fileTime = attrs.creationTime();
                    // 将文件创建时间转成毫秒
                    long millis = fileTime.toMillis();
                    SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
                    Date date = new Date();
                    date.setTime(millis);
                    // 毫秒转成时间字符串
                    String time = dateFormat.format(date);
                    // 这里根据时间来判断将20年之前的文件拷贝到OSS上
                    if (time.compareTo("2020-01-01 00:00:00") <= 0) {
                        uploadObjectOSS(client, f);
                        System.out.println(time + " " + f.getName());
                        // 拷贝完成之后删除文件
                        f.delete();
                    }
                }
            }
        }
        System.out.println("拷贝完成!");
        client.shutdown();
    }

    //10进制数字转16进制字符串
    public static String encodeHEX(Integer numb){
        String hex= Integer.toHexString(numb);
        hex = hex.toUpperCase();
        if (hex.length() < 2) {
            hex = "0" + hex;
        }
        return hex;
    }

    // 向阿里云的OSS存储中存储文件
    public static String uploadObjectOSS(OSSClient client, File file) {
        String resultStr = null;
        try {
            InputStream is = new FileInputStream(file);
            String fileName = file.getName();
            Long fileSize = file.length();
            //创建上传Object的Metadata
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(is.available());
            metadata.setCacheControl("no-cache");
            metadata.setHeader("Pragma", "no-cache");
            metadata.setContentEncoding("utf-8");
            metadata.setContentType(getContentType(fileName));
            metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
            //上传文件
            PutObjectResult putResult = client.putObject(ossProperties.getBucketName(), ossProperties.getFilePath() + fileName, is, metadata);
            //解析结果
            resultStr = putResult.getETag();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultStr;
    }

    // 通过文件名判断并获取OSS服务文件上传时文件的contentType
    public static final String getContentType(String fileName){
        String fileExtension = fileName.substring(fileName.lastIndexOf(".")+1);
        if("bmp".equalsIgnoreCase(fileExtension)) return "image/bmp";
        if("gif".equalsIgnoreCase(fileExtension)) return "image/gif";
        if("jpeg".equalsIgnoreCase(fileExtension) || "jpg".equalsIgnoreCase(fileExtension)  ) return "image/jpeg";
        if("png".equalsIgnoreCase(fileExtension)) return "image/png";
        if("html".equalsIgnoreCase(fileExtension)) return "text/html";
        if("txt".equalsIgnoreCase(fileExtension)) return "text/plain";
        if("vsd".equalsIgnoreCase(fileExtension)) return "application/vnd.visio";
        if("ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) return "application/vnd.ms-powerpoint";
        if("doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) return "application/msword";
        if("xml".equalsIgnoreCase(fileExtension)) return "text/xml";
        return "text/html";
    }
}

        将程序打包成jar包,放到linux服务器上运行nohup java -jar "你的jar包名字".jar &就可以运行了,日志会输出到nohup.out文件上。

阿里云oss文件拷贝到服务器

        拷贝功能实现了,如果后期出现需要将文件拷贝回来的情况还是要重新写一个程序的,但是网上大部分文章都没有写如何拷贝阿里云oss上的文件夹,所以这里我也写好应对此情况的程序了。

        OssProperties类上面写了,这里我就直接放代码

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import entity.OssProperties;

import java.io.File;
import java.util.ArrayList;

public class test {

    static OssProperties ossProperties = new OssProperties();

    public static void main(String[] args) throws Exception {
        System.out.println("开始运行...");
        OSSClient ossClient = new OSSClient(ossProperties.getOssaddress(), ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
        // 构造ListObjectsRequest请求
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(ossProperties.getBucketName());
        //Delimiter 设置为 “/” 时,罗列该文件夹下的文件
        listObjectsRequest.setDelimiter("/");
        for(int i = 0; i < 256; i++) {
            for (int j = 0; j < 256; j++) {
                String a = encodeHEX(i);
                String b = encodeHEX(j);
                //Prefix 设为某个文件夹名,罗列以此 Prefix 开头的文件
                listObjectsRequest.setPrefix("FastDFS_bak/data/" + a + '/' + b + '/'); // 这里写需要拷贝的文件夹名称
                ObjectListing listing = ossClient.listObjects(listObjectsRequest);
                ArrayList<String> list = new ArrayList<>();
                // 遍历所有Object:目录下的文件
                for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
                    String key = objectSummary.getKey();
                    System.out.println(key);

                    // OSS存储文件的路径
                    String basePath = key;
                    // 下载到本地的目录,自己随意存放
                    String localPath = ""; // oss文件拷贝到服务器的存放路径
                    // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
                    ossClient.getObject(new GetObjectRequest(ossProperties.getBucketName(), basePath), new File(localPath + key.substring(16)));
                }
            }
        }

        System.out.println("运行完毕...");
        ossClient.shutdown();
    }

    //10进制数字转16进制字符串
    public static String encodeHEX(Integer numb){
        String hex= Integer.toHexString(numb);
        hex = hex.toUpperCase();
        if (hex.length() < 2) {
            hex = "0" + hex;
        }
        return hex;
    }
}

        还是同样的部署操作,将程序打包成jar包,放到linux服务器上运行nohup java -jar "你的jar包名字".jar &就可以运行了,日志会输出到nohup.out文件上。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
上传文件阿里云OSS可以通过以下步骤实现: 1. 引入aliyun-java-sdk-oss依赖 ``` <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-java-sdk-oss</artifactId> <version>3.10.0</version> </dependency> ``` 2. 创建OSSClient对象 ``` String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; String accessKeyId = "yourAccessKeyId"; String accessKeySecret = "yourAccessKeySecret"; String bucketName = "yourBucketName"; OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ``` 3. 上传文件 ``` String objectName = "yourObjectName"; // 上传到OSS后的文件名,可以包含路径 File file = new File("yourLocalFile"); // 要上传的文件路径 ossClient.putObject(bucketName, objectName, file); ``` 4. 关闭OSSClient对象 ``` ossClient.shutdown(); ``` 完整的Java代码示例: ``` import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import java.io.File; public class OSSUploader { public static void main(String[] args) { String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; String accessKeyId = "yourAccessKeyId"; String accessKeySecret = "yourAccessKeySecret"; String bucketName = "yourBucketName"; String objectName = "yourObjectName"; // 上传到OSS后的文件名,可以包含路径 File file = new File("yourLocalFile"); // 要上传的文件路径 // 创建OSSClient对象 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 上传文件 ossClient.putObject(bucketName, objectName, file); // 关闭OSSClient对象 ossClient.shutdown(); } } ``` 需要注意的是,上传文件时可以指定上传后的文件名,也可以使用原文件名。同时,上传文件的大小不能超过OSS的限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青旬_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值