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
实现
下面给出定时任务的代码,基本流程是:
- 每一个minio object的信息我都在数据库中记录。我先从数据库中查询最新上传的minio的object的date
- Java扫描ftp约定好上传的目录,如果文件的modify time 大于 minio object最新上传的 time,那么说明此文件应该同步到上传到minio上
- 拿到这些应该上传到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 断点续传的更多相关文章
- 【大话QT之十】实现FTP断点续传(需要设置ftp服务器为“PASV”被动接收方式)
应用需求: 网盘开发工作逐步进入各部分的整合阶段,当用户在客户端修改或新增加一个文件时,该文件要同步上传到服务器端对应的用户目录下,因此针对数据传输(即:上传.下载)这一块现在既定了三种传输方式,即: ...
- 实现FTP断点续传
应用需求: 网盘开发工作逐步进入各部分的整合阶段,当用户在客户端修改或新增加一个文件时,该文件要同步上传到服务器端对应的用户目录下,因此针对数据传输(即:上传.下载)这一块现在既定了三种传输方式,即: ...
- Java ftp断点续传
FtpTransFile类 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...
- 【大话QT之十】实现FTP断点续传
应用需求: 网盘开发工作逐步进入各部分的整合阶段,当用户在client改动或新添加一个文件时.该文件要同步上传到server端相应的用户文件夹下,因此针对传输数据(即:上传.下载)这一块如今既定了三种 ...
- ftp断点续传
有时候ftp的文件太大了 容易断掉 使用shell下载 1 #!/bin/bash 2 cd /data2/GATK2/refSeqDB/1000genomePhase3 3 ftp -v -n 19 ...
- edtftpj让Java上传FTP文件支持断点续传
在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...
- 用windows自带的ftp.exe实现断点续传的方法
摘自http://www.jb51.net/article/10604.htm 动画下载地址: http://www.chinesehack.org/soft/book/goonftp-jc.rar ...
- TCP/IP协议原理与应用笔记02:断点续传
1.断点续传简介: FTP(文件传输协议的简称)(File Transfer Protocol. FTP)客户端软件断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人 ...
- 学习笔记之 curl 命令用法详解
[前言] 本文翻译和整理自 Linux-2.6.32 中和 curl 相关的 Manual Page 描述文档. 文档目的仅在提醒读者所遗忘的知识点,故在整理时削弱了阅读流畅性,适用于对 cu ...
- python基础----文件处理
一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 正趣果上果 Interesting fruit fruit 词:郭婞 曲:陈粒 编曲/混音/和声:燕池 萧: ...
随机推荐
- WebKit Inside: CSS 样式表解码字符集
CSS 样式表引入有3种方式: 外部样式表.内部样式表.行内样式,不同的引入方式,解码样式表的字符集原理不一样. 外部样式表 外部样式表由 link 标签引入,当 WebKit 解析到 link 标签 ...
- OSPF常用配置和常用的查看命令
转载请注明出处: 1.启动OSPF进程,进入OSPF视图. [Huawei] ospf [ process-id | Router ID Router ID ] 路由器支持OSPF多进程,进程号是本地 ...
- 使用 QuickTime Player 将手机投屏到旧版 Macbook pro
由于旧版的 MacBook Pro 不支持 AirPlay,我们可以通过Mac系统自带的应用程序[QuickTime Player]来进行投屏操作. 以下是具体的步骤: 首先,使用USB数据线将你的 ...
- json数组格式问题
---恢复内容开始--- 使用jsonserver来模拟后台数据接口时犯了一个很低级的错误 找了很久没有发现有什么不对劲的地方,后来仔细发现原来是一个很细微的语法问题:}] 中间不能有逗号!! -- ...
- NOI Linux 食用指北
写这篇 blog 的原因是某个小朋友要考 CSP 了还不会用 linux,怎么回事呢. 单击图片即可放大. 前置- linux 虚拟机的安装 在官网 / 其他地方下载 VMware. 在 noi 官网 ...
- 使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录
前言 RabbitMQ 是一个功能强大的开源消息队列系统,它实现了高效的消息通信和异步处理. 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验. 特点 成熟,稳定 消息持久 ...
- Vue源码学习(十四):diff算法patch比对
好家伙, 本篇将会解释要以下效果的实现 1.目标 我们要实现以下元素替换的效果 gif: 以上例子的代码: //创建vnode let vm1 = new Vue({data:{name:'张三' ...
- Go类型嵌入介绍和使用类型嵌入模拟实现“继承”
Go类型嵌入介绍和使用类型嵌入模拟实现"继承" 目录 Go类型嵌入介绍和使用类型嵌入模拟实现"继承" 一.独立的自定义类型 二.继承 三.类型嵌入 3.1 什么 ...
- 题解 CF690C1
题目大意: 给定一张 \(n\) 个点 \(m\) 条边的无向图,判断这是不是一棵树. 题目分析: 两种思路: 思路一: 不需要建图,直接使用并查集判环即可 最后判断一下图联不联通就行,具体方法就是看 ...
- HarmonyOS 高级特性
引言 本章将探讨 HarmonyOS 的高级特性,包括分布式能力.安全机制和性能优化.这些特性可以帮助你构建更强大.更安全.更高效的应用. 目录 HarmonyOS 的分布式能力 HarmonyOS ...