Java代码实现上传文件到Ftp服务器

           近期项目中,需要在后台上传批量产品操作视频在公众号菜单中展示供用户在线学习。最初的打算是用阿里OSS对象存储,但是出于流量成本考虑没有采用。采取的方案是把视频上传到项目服务器上,第一种方案是用流上传,但是遇到各种坑,方法行不通。老大给的方案是用ftp方式进行上传,之前用过ftp客户端直接把本地文件拖到服务器上,思路就是用代码模拟这个拖的操作。废话不多说,直接上代码:

1 添加maven依赖

<!--ftp相关-->
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.3</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-ftp</artifactId>
    <version>2.13.2</version>
</dependency>

2 根据网上资料建议  配置FTPClient相关信息

 
@Log4j
public class FtpUtils {
    private static int port=21;//ftp服务器端口

    public static FTPClient getClient(){
        FTPClient ftpClient = new FTPClient();
        //ftp服务器地址
        String url="url";
        //ftp服务器登陆用户名
        String name="userName";
        //ftp服务器登陆密码
        String password="mima";
        //ftp服务器目标文件位置
        String MENU="/xx";
        try {
            log.info("开始连接ftp服务器");
            long start = System.currentTimeMillis();
            ftpClient.connect(url,port);
            ftpClient.login(name, password);
            boolean flag = FTPReply.isPositiveCompletion(ftpClient.getReplyCode());
            if (!flag){
                throw  new com.bingkun.weixin.common.exception.ApplicationException("ftp服务器连接失败!");
            }
            long end = System.currentTimeMillis();
            log.info("连接ftp服务器成功,耗时"+(end-start)+"毫秒");
            ftpClient.setCharset(Charset.forName("UTF-8"));
            ftpClient.setControlEncoding("UTF-8");
            //ftpClient.changeToParentDirectory();//切换到根目录
            ftpClient.changeWorkingDirectory(MENU );
            //设置文件类型
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ftpClient;
    }

3 Controller及具体上传逻辑


 
@Component
@Log4j
public class FtpServiceImpl implements FtpService {
    private String dateFormat="yyyyMMdd";
    //http前缀
    private String prefix="http://";
    //ftp服务器地址
    String url= "";
    //ftp服务器目标文件位置
    String menu="";
    @Override
    public Map<String, Object> upload(MultipartFile file) {
        Transaction cat = Cat.newTransaction(Constants.FTP_UPLOAD, "uploadFile");
        try{
        Map<String, Object> map = catFtpUpload(file);
        cat.setStatus(Transaction.SUCCESS);
        return map;
        } catch (Exception e){
            Cat.logError(e);
            cat.setStatus(e);
        }finally {
            cat.complete();
        }
        return null;
    }
    public Map<String, Object> catFtpUpload(MultipartFile file) {
        Map map=new HashMap();
        FTPClient client = FtpUtils.getClient();
        String originalFilename = file.getOriginalFilename();
        String randomString=UUID.randomUUID().toString().replaceAll("-","");
        //文件后缀
        String suffix=originalFilename.substring(originalFilename.lastIndexOf("."));
        String fileName=(DateUtils.dateFormat(new Date(), dateFormat))+randomString+suffix;
        String finalUrl=prefix+url+menu+"/"+fileName;
        try {
            long start = System.currentTimeMillis();
            log.info(String.format("开始上传文件:%s",originalFilename));
            InputStream inputStream = file.getInputStream();
            boolean flag = client.storeFile(fileName, inputStream);
            if (flag){
                long end = System.currentTimeMillis();
                log.info(String.format("文件:%s上传成功,耗时:%d毫秒",originalFilename,(end-start)));
                map.put("url",finalUrl);
            }
            inputStream.close();
//            client.logout();//退出登录 退出就执行不成功了 bug
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (client.isConnected()){
                try {
                    client.disconnect();
                } catch (IOException e) {
                    log.error(String.format("ftp关闭连接失败:%s",e));
                }
            }
        }
        return map;
    }

更新如上,添加日志及Cat监控,关闭连接操作。

希望能给用到的小伙伴一个借鉴,少踩坑。

霍金去世了,有点难过!

                                -2018/03/14 于上海


  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值