java操作 VSFTP 部分

文件上传工具类

文件上传至对应的ftp服务器,并返回一个路径(存储路径)

package com.yang.util;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;

/**
 * 文件上传工具类
 */
public class FTPUtil {

    private static Logger logger = LoggerFactory.getLogger(FTPUtil.class);

    /**
     * 文件上传
     *
     * @param host     服务器IP
     * @param port     服务器端口
     * @param username 服务器用户名
     * @param password 服务器密码
     * @param path     /home/ftpuser/test/年/月/日
     * @param fileName 文件名1.jpg
     * @param is       文件流
     * @return
     */
    public static String fileUpload(String host, int port, String username, String password,
                                    String path, String fileName, InputStream is) {
        // 判断操作是否正确
        boolean flag = false;
        // 返回的文件名
        String remote = null;
        // 创建ftp客户端
        FTPClient ftpClient = new FTPClient();
        try {
            // 设置编码字符集
            ftpClient.setControlEncoding("UTF-8");
            // 连接FTP服务器
            ftpClient.connect(host, port);
            // 登录
            flag = ftpClient.login(username, password);
            if (!flag) {
                logger.error("文件服务器用户名或密码错误");
                return null;
            }
            // 获取登录的状态码
            int reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                return null;
            }
            /*****************创建目录 一次只能创建一个目录*****************/
            String basePath = "/";
            for (String p : path.split("/")) {
                basePath += (p + "/");
                // 判断目录是否已经存在
                boolean hasPath = ftpClient.changeWorkingDirectory(basePath);
                if (!hasPath) {
                    // 创建目录 一次只能创建一个目录,失败的原因都是权限问题
                    ftpClient.makeDirectory(basePath);
                }
            }

            // 重新指定上传的路径
            ftpClient.changeWorkingDirectory(path);
            /*******************************************************/

            // 指定上传方式为二进制方式
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            // 得到文件后缀
            String suffix = fileName.substring(fileName.lastIndexOf("."));
            System.out.println("文件后缀为:" + suffix);

            remote = UUIDUtil.getUUID() + suffix;
            // remote指定上传远程服务器的文件名 local指本地的输入流
            flag = ftpClient.storeFile(remote, is);
            if (!flag) {
                logger.error("文件上传失败,可能是权限,防火墙等问题");
                return null;
            }
        } catch (IOException e) {
            logger.error("文件上传错误,错误原因:" + e.getMessage());
        } finally {
            try {
                if(is != null)
                    is.close();

                ftpClient.logout();

                if(ftpClient.isConnected())
                    ftpClient.disconnect();
            } catch (IOException e) {
                logger.error("文件上传错误,错误原因:" + e.getMessage());
            }
        }
        return remote;
    }

    public static void main(String[] args) throws FileNotFoundException {
        InputStream is = new FileInputStream(new File("D://flower.jpg"));
        fileUpload("192.168.10.100", 21, "ftpuser", "123456",
                "/home/ftpuser/test/2019/09/10", "flower.jpg", is);
    }

}

————————————————————————————————

实战测试

配套的其他工具类

  • 时间日期格式转换工具类
package com.yang.utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @see(功能介绍) : 时间日期格式转换工具类
 * @version(版本号) : 1.0
 * @author(创建人) : Dylan
 * @since : JDK 1.8
 */
public class DateUtil {

    public static String pattern_date = "yyyy/MM/dd";
   
    public static String getDateStr(LocalDateTime date, String pattern) {
        // JDK1.7
        //SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        //return sdf.format(new Date());

        // JDK1.8
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
        return dtf.format(date);
    }

    public static void main(String[] args) {
        String dateStr = DateUtil.getDateStr(LocalDateTime.now(), DateUtil.pattern_date);
        System.out.println(dateStr);
    }

}

  • 生成UUID工具类
package com.yang.utils;

        import java.util.UUID;

/**
 * 生成UUID工具类
 */
public class UUIDUtil {

    public static String getUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    public static void main(String[] args) {
        System.out.println(getUUID());
    }

}

开始测试

  • controller层
package com.yang.controller;

import com.yang.result.FileResult;
import com.yang.service.FileUploadServiceI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * 文件上传controller
 */
@Controller
@RequestMapping("/fileUpload")
public class FileUploadController {

    @Autowired
    private FileUploadServiceI fileUploadService;

    /**
     * 文件上传
     *
     * @return
     */
    @RequestMapping("/save")
    @ResponseBody
    public FileResult save(MultipartFile file) {
        try {
            return fileUploadService.fileUploadSave(file.getOriginalFilename(), file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

  • 接口
package com.yang.service;
import com.yang.result.FileResult;
import java.io.InputStream;
/**
* @see(功能介绍) : 文件上传 Service
* @version(版本号) : 1.0
* @author(创建人) : Dylan
* @since : JDK 1.8
*/
public interface FileUploadServiceI {
 /**
 * 上传文件至 ftp 服务器
 *
 * @param fileName 文件名称
 * @param inputStream 输入流
 * @return
 */
 public FileResult fileUploadSave(String fileName, InputStream inputStream);
}

  • service 层
package com.yang.service.impl;

import com.yang.result.FileResult;
import com.yang.service.FileUploadServiceI;
import com.yang.utils.DateUtil;
import com.yang.utils.FTPUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.InputStream;
import java.time.LocalDateTime;

/**
 * Created by zhi on 2019/9/10.
 */
@Service
public class FileUploadServiceImpl implements FileUploadServiceI {

    @Value("192.168.16.10")
    private String ftpHost;
    @Value("21")
    private Integer ftpPort;
    @Value("ftpuser")
    private String ftpUsername;
    @Value("123456")
    private String ftpPassword;
    @Value("/home/ftpuser/test/")
    private String ftpPath;

    @Override
    public FileResult fileUploadSave(String fileName, InputStream inputStream) {

        // 修改文件上传路径,修改为:/home/ftpuser/test/年/月/日
        String dateStr = DateUtil.getDateStr(LocalDateTime.now(), DateUtil.pattern_date);
        // 最终文件上传路径
        String basePath = ftpPath + dateStr;
        // 文件上传,返回上传成功的文件名
        String result = FTPUtil.fileUpload(ftpHost, ftpPort, ftpUsername, ftpPassword, basePath, fileName, inputStream);
        // 判断
        FileResult fileResult = new FileResult();
        if (null == result || result.length() < 1) {
            fileResult.setMessage("文件上传失败");
            fileResult.setError("error");
            return fileResult;
        }

        fileResult.setMessage("文件上传成功");
        fileResult.setSuccess("success");
        // 修改返回的文件地址,修改为:http://192.168.10.100/2019/09/10/939317e3c2084d239a4f21b1684b8df4.jpg
        String fileUrl = "http://" + ftpHost + "/" + dateStr + "/" + result;
        fileResult.setFileUrl(fileUrl);
        return fileResult;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值