日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

MinIO FTP 断点续传

發布時間:2024/1/5 windows 55 coder
生活随笔 收集整理的這篇文章主要介紹了 MinIO FTP 断点续传 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MinIO FTP 斷點續傳

對于minio來說,使用minio官方的Java SDK和開啟FTP都是不支持斷點續傳的。對于要實現http接口的斷點續傳,可以通過調用Amazon S3 REST API來實現,可以參考開源項目:https://gitee.com/Gary2016/minio-upload

本文是關于FTP斷點續傳。

FTP斷點續傳方案

啟動一個FTP服務器,此FTP支持斷點續傳。然后將FTP上傳的文件同步到MinIO

同步的方式有兩種:

  • 通過定時任務掃描指定目錄(ftp上傳時也上傳到指定目錄),如果有更新時間大于Minio中最新對象的上傳時間的,那么就說明應該將他同步到Minio上
  • 提供一個按鈕,給用戶可以手動刷新,觸發ftp指定文件夾下的“符合條件的”文件同步到Minio

實現

下面給出定時任務的代碼,基本流程是:

  1. 每一個minio object的信息我都在數據庫中記錄。我先從數據庫中查詢最新上傳的minio的object的date
  2. Java掃描ftp約定好上傳的目錄,如果文件的modify time 大于 minio object最新上傳的 time,那么說明此文件應該同步到上傳到minio上
  3. 拿到這些應該上傳到minio 的file,for循環以此上傳即可。

代碼如下:

    @Value("${ftpDirPath}")
    private String ftpDirPath;

    MinioClient minioClient;
    @PostConstruct
    void init() {
        minioClient = MinioClient.builder()
                .endpoint("http://" + minioAddress)
                .credentials(minioAccessKey, minioSecretKey)
                .build();
    }

	@SneakyThrows
    @Scheduled(fixedDelay = 60 * 60 * 1000, initialDelay = 10 * 60 * 1000)
    public void checkFtpServer() {
        log.info("Check ftp server /opt/ftp directory have new file upload.");
        // get latest time form minio_object table. if file update time is bigger than minio_object latest time.
        // then we should upload the file to minio.
        // notice: if i use update time, I should ensure linux date is same as database date (notice same timezone!!)
        MinioObjectDO latestDateDO = minioObjectDao.getLatestDate();
        long latestTime;
        if (latestDateDO == null) {
            latestTime = 0L;
        } else {
            latestTime = latestDateDO.getUploadTime().getTime();
        }
        LinkedList<File> needUploadToMinioFile = getDirAllFileFilterWithLastModify(ftpDirPath, latestTime);

        // upload file to minio
        for (File file : needUploadToMinioFile) {
            InputStream initialStream = Files.newInputStream(file.toPath());
            minioClient.putObject(
                    PutObjectArgs.builder().bucket("cogent").object(removeFtpPath(file.getAbsolutePath())).stream(
                                    initialStream, -1, 10485760)
                            .build());

            initialStream.close();
            log.info("upload file: {} successfully", file.getName());
        }
    }

    private String removeFtpPath(String absolutePath) {
        return absolutePath.substring(ftpDirPath.length() + 1);
    }

    private LinkedList<File> getDirAllFileFilterWithLastModify(String ftpDirPath,long latestTime) {
        File dirPath = new File(ftpDirPath);
        // 2023-12-01 時間戳
        long time = latestTime;
        LinkedList<File> filteredFiles = new LinkedList<>();
        process(dirPath, filteredFiles, time);
        return filteredFiles;
    }

    private void process(File dirPath, LinkedList<File> filteredFiles, long time) {
        File[] files = dirPath.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                process(file, filteredFiles, time);
            } else {
                if (file.lastModified() >= time) {
                    filteredFiles.add(file);
                }
            }
        }
    }

這里只放定時任務的。

issue

關于斷點續傳只上傳了部分文件

ftp斷點續傳只上傳了部分文件,然后這部分文件被同步到了minio上。這其實沒有問題,如果ftp接著上傳剩下的文件,那么文件的updateTime就會修改,那么下次再同步時會再次上傳此文件,對于同名的object,minio進行覆蓋。

總結

以上是生活随笔為你收集整理的MinIO FTP 断点续传的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。