Sftp协议下文件上传、下载
使用JSch进行Sftp连接
问题产生
我用common-net,ftp连接时使用21端口会超时,后来发现使用Xftp工具用21端口也超时
1 | Connection timed out: connect |
查了下百度,端口问题。
ftp服务用的是20、21端口,客户端添加ftp信息的时候输入的是21端口
ssh服务用的是22端口,应用于远程ssh管理Linux服务器;
然后我换了22端口进行尝试。
1 | Could not parse response code. |
异常如上,百度了下,于是开始用sftp协议尝试。
问题解决
我制作了一个工具类,以供调用。
maven依赖
1 | <dependency> |
还有一些依赖,如springMVC的依赖。
简单上传
遇到了很多的问题,像如何简化、如何创建目录、如何检查目录是否存在、认证问题等,在注释里写得很详细。
1 | package IO_Utils; |
下载方法未写
实例
我现在需要将一个文件(图片为例)上传到服务器,使用sftp协议,需求如下:
- 点击上传按钮,选择文件后即可上传
- 能看到上传的进度和速度
- 能在上传成功、异常结束时得到反馈
- 要求在上传后,程序自动显示该图片
- 图片需要按照一定分类去存储,以方便管理,减少资源消耗
- 图片名称不能重复,并且图片能正确显示
- 全程支持中文
- 支持断点续传
首先,进度监控、断点续传
很显然我们目前的这个工具类还不能满足我们的需求,它还需要两个功能:
1.实时监控,这样我们才能知道上传的速度、进度
2.断点续传,值得高兴的是,Jsch为我们提供了这个功能。
1. 实时监控
SftpProgressMonitor
Jsch提供了一个SftpProgressMonitor接口,包括了初始化时执行的init()方法、每传输一个数据块就会执行一次的count()方法、以及在传输结束时执行的end()方法。
基于这个接口,我们可以写出一个简单监控类:
1 | package IO_Utils; |
它的使用方式:
1 | long size = inputStream.available();//通过流获取文件大小 |
很抱歉,由于时间关系,我不能像以往那样详细说明,Jsch:put方法的重载。
SftpProgressMonitor+TimerTask+Pojo
我们需要获得传输的速度,所以需要有个Timer来帮忙,对此不了解的可查看Timer的使用.
我们可以通过重写TimerTask类的run()方法,来实现我们需要的功能。我写了一个start()方法用于创建timer对象,新建计划任务,stop()方法用于终止计时。run()方法会按照我们设置的计划,每隔一段时间执行一次,用单独的线程来执行。
我把需要的信息封装到一个pojo类里,你也可以不封装。
由此便有了一个新的监控类:
1 | package Sftp_service; |
2.断点续传
好在Jsch提供了这个功能,我们不必再费脑筋。我们只需要在执行put()时,把mode的值改为ChannelSftp.RESUME即可。
1 | long size = inputStream.available(); |
OVERWRITE是覆盖,APPEND是扩展。
其次,文件夹分类、文件名随机
直接看代码即可,这是service层:
1 | package com.SH.Service.ServiceImpl; |
其中用imageSftp.properties存储服务器信息,使用@Value注解获取配置文件信息。
spring配置:
1 | <bean id="dbproperties" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"> |
imageSftp.properties:
1 | ImgServerIp=78.141.206.203 |
ID_Imghelper,根据时间随机生成图片Id(文件名)的工具类:
1 | package ID_Utils; |
最后,图片回显、结果反馈、中文支持等
图片回显只需要把服务器上的文件地址拼接出来即可。
这里给个参考,Controller:
1 | package com.SH.Controller; |
参考文章:
https://blog.csdn.net/weixin_36910300/article/details/80532868
https://blog.csdn.net/qq_33390789/article/details/78614466
https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html
https://www.cnblogs.com/ssslinppp/p/6248763.html
https://blog.csdn.net/chaogewudi1/article/details/81629183
https://www.cnblogs.com/awkflf11/articles/5179156.html
https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html
https://blog.csdn.net/ecjtuxuan/article/details/2093757
https://blog.csdn.net/hl_java/article/details/79035237
https://blog.csdn.net/zjy15203167987/article/details/82531772