背景说明: 某b/s系统,支持用户上传图片文件等附件文件,上传后的文件存到了某一个web服务器的特定路径下,然后数据库的表里面记录了web访问的url路径和文件在本地物理磁盘存储的路径,这里不考虑文件服务器、对象存储等来讲对于小项目来讲是够用的。数据库表的结构示例为
file_id | file_url | file_path |
1 | http://x.x.x.x/static/xxx.jpg | d:/xxx/xxx/xxx.jpg |
2 | http://x.x.x.x/static/xxx1.jpg | d:/xxx/xxx/xxx1.jpg |
现在的需求是,通过kettle,实现定时将用户上传的附件文件上传到某个ftp里面去,下面是实现过程:
1.流程
大概流程就是读取数据库表里面的记录内容,然后逐条找到文件去上传(废话)。这里面有一个小点需要注意,那就是读取数据库表的记录后,数据是多于1条记录的,但是文件上传操作一次只支持上传一个文件,所以要把数据库表的数据依次赋值给变量,通过变量传递实现循环单个文件上传。
2.总体任务
忽略上面的那些内容,看下面的上传附件文件这个,它的内容是
对应的ktr内容是
其中的表输入执行的sql是select file_path from 附件表 ,复制记录到结果 这一步没有什么好配置的,保持默认即可。
然后“循环处理文件”这个作业项的内容是这样的:
务必将里面的“执行每一个输入行”选中。
然后循环读取附件文件任务.ktr的内容是这样的:
其中的“从结果获取记录”的内容是:
这里面的FILE_PATH就是从数据库里面查询出来的字段名称,然后Transformation executor的内容是:
注意这里面涉及到Parameters变量FILE_PATH的传递,看上图的配置
然后“上传一个文件.ktr”的内容是:
在我这个项目里面,附件需要上传到一个特定的sftp目录里面去,这个特定的sftp path是通过自定义常量数据提供的,如下图:
具体TARGET_PATH的值是多少就不展示了,根据自己的需要配置或者不配置都行。
然后获取变量的操作是这样的:
下一步真正是通过sftp去上传kettle file的操作是这样的:
source filename field指定为FILE_PATH变量,Remote director指定为TARGET_PATH,勾选Create folder,在General里面配置sftp的ip用户名和密码信息,这样整个读取数据库表里面记录内容,实现对应附件文件上传的kettle脚本就可以正常工作了。