springboot 集成ftp

springboot 集成ftp 上传文件到阿里云

依赖包:


        <dependency>
            <groupId>commons-netgroupId>
            <artifactId>commons-netartifactId>
            <version>3.3version>
        dependency>

controller:

RestController
@RequestMapping("/common")

public class CommonController {

    @Autowired
    FileUtil fileUtil;
    @PostMapping("/upload")
    public Result uploadFile(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {

        String url = fileUtil.upload2(file.getInputStream(), file.getOriginalFilename());
        return Result.success(url);

    }

}

文件上传工具类


@Component
public class FileUtil {

    //ftp服务器ip地址
    @Value("${custom.config.file-server.ip}") // 相关配置放在application.properties 中
    String FTP_ADDRESS;
    //端口号
    @Value("${custom.config.file-server.port}")
    Integer FTP_PORT;
    //用户名
    @Value("${custom.config.file-ftp-user}")
    String FTP_USERNAME;
    //密码
    @Value("${custom.config.file-ftp-password}")
    String FTP_PASSWORD;
    //图片路径
    @Value("${custom.config.file-savepath}")
    String FTP_BASEPATH;

    //根据当前文件生成 文件夹
    private static String getTimePath() {
        Date now = new Date();

        DateFormat format = new SimpleDateFormat("yyyy/MM/dd/");
        return format.format(now);
    }

    /**
     * author : wangwei
     * description: 使用ftp 上传文件
     * date:      2019/6/5
     */

    public String upload(InputStream inputStream, String originName) {

        StringBuilder url = new StringBuilder();

        FTPClient ftp = new FTPClient();
        ftp.setControlEncoding("GBK");
        try {
            int reply;
            ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
            ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录
            reply = ftp.getReplyCode();
            System.out.println("reply:" + reply);

            ftp.enterLocalPassiveMode();//开启被动模式,否则文件上传不成功,也不报错

            String timePath = getTimePath();
            String saveDir = FTP_BASEPATH + timePath;
            url.append(saveDir);

            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            createDir(ftp, saveDir);
            //ftp.makeDirectory(saveDir);
         //   ftp.changeWorkingDirectory(FTP_BASEPATH);
            originName= System.currentTimeMillis()+originName.substring(originName.lastIndexOf('.'));
            url.append(originName);
            ftp.storeFile(originName, inputStream);
            inputStream.close();
            ftp.logout();

        } catch (IOException e) {
            throw new RuntimeException("文件上传失败");
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }

        return url.toString();
    }

    // 创建文件夹,并切换到该文件夹
    // 比如: hello/test
    //最终会切换到test 文件夹返回
    private void createDir(FTPClient client, String path) throws IOException {
        String[] dirs = path.split("/");
        for (String dir : dirs) {
            if (StringUtils.isEmpty(dir)) {
                continue;
            }
            if (!client.changeWorkingDirectory(dir)) {
                client.makeDirectory(dir);
            }
            client.changeWorkingDirectory(dir);
        }
    }

}

需要注意的是:

  1. 代码注意
   ftp.enterLocalPassiveMode();//开启被动模式,否则文件上传不成功,也不报错
  1. 阿里云防火墙
    安全组开启21端口

  2. ftpuser 权限

chmod 774 ftpuser -R // 将ftpuser 文件夹及其子文件夹权限设置为其他人可读
  1. nginx 配置
    /etc/nginx/conf.d/default.conf
    添加以下代码:
location /pics/ {
   root /home/ftpuser/; # 定位到 linux 上的对应文件夹
}

测试效果:

推荐FTP 客户端应用程序:
FileZilla ,完全免费的
推荐SSH 远程连接终端:SecurScrt

你可能感兴趣的:(springboot,web后端)