Java通过FTP上传图片/文件到服务器

Java代码实现过程

1.pom.xml文件引入依赖,更新Maven

		<!--  ftp上传  -->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.3</version>
        </dependency>

2.创建FTP上传工具类:FtpUtil or FileUtil

package com.xxx.xxxxxx.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

/**
 * ftp上传下载工具类
 */
public final class FileUtil {

    private FileUtil() {
    }

    /**
     * 获取文件后缀
     *
     * @param fileName 文件名
     * @return boolean
     */
    public static String getFileExtension(String fileName) {
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    /**
     * 判断文件是否图片类型
     *
     * @param fileName 文件名
     * @return boolean
     */
    public static boolean isImage(String fileName) {
        String extension = getFileExtension(fileName);
        String[] imageExtension = new String[]{"jpeg", "jpg", "bmp", "png", "webp", "gif"};
        for (String e : imageExtension) {
            if (extension.toLowerCase().equals(e)) {
                return true;
            }
        }

        return false;
    }

    /**
     * Description: 向FTP服务器上传文件
     * @param host FTP服务器hostname
     * @param port FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param basePath FTP服务器基础目录
     * @param filePath FTP服务器文件存放路径。文件的路径为basePath+filePath。
     * @param filename 上传到FTP服务器上的文件名
     * @param input 输入流
     * @return 成功返回true,否则返回false
     */
    public static boolean uploadFile(String host, int port, String username, String password, String basePath,
                                     String filePath, String filename, InputStream input) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);// 连接FTP服务器
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            //切换到上传目录
            if (!ftp.changeWorkingDirectory(basePath+filePath)) {
                //如果目录不存在创建目录
                String[] dirs = filePath.split("/");
                String tempPath = basePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir)) continue;
                    tempPath += "/" + dir;
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        if (!ftp.makeDirectory(tempPath)) {
                            return result;
                        } else {
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //上传文件
            if (!ftp.storeFile(filename, input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }

    /**
     * Description: 从FTP服务器下载文件
     * @param host FTP服务器hostname
     * @param port FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param remotePath FTP服务器上的相对路径
     * @param fileName 要下载的文件名
     * @param localPath 下载后保存到本地的路径
     * @return
     */
    public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
                                       String fileName, String localPath) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                if (ff.getName().equals(fileName)) {
                    File localFile = new File(localPath + "/" + ff.getName());

                    OutputStream is = new FileOutputStream(localFile);
                    ftp.retrieveFile(ff.getName(), is);
                    is.close();
                }
            }

            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }
}

3.调用代码,示例一(main方法内)

    public static void main(String[] args) throws IOException {
		Date date = new Date();
		String filePath = "queMgtLogo";//存放图片/文件的文件夹名称
        String filename = "img" + date.getTime() + ".png";//此处用前缀+时间戳做文件名称,避免重复
        InputStream is = new FileInputStream("C:\\Users\\24674\\Pictures\\test.jpg");
        /*   服务器IP   端口   账号   密码   根路径   保存目录   保存文件名   图片   */
        boolean result = FileUtil.uploadFile("92.137.92.137", 21, "account", "password", "", filePath, filename, is);
        if (result) {
            return filename;
        } else {
            return null;
        }
    }

4.调用代码,示例二(项目实例)

(1)项目配置yml文件
ftp:
  url: 92.137.92.137
  loginId: account
  password: password
  port: 21
(2)服务层Service
package com.xxx.xxxxxx.service.thirdparty;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * 文件上传服务
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class FileService {

    @Value("${ftp.url}")
    private String ftpUrl;
    @Value("${ftp.loginId}")
    private String ftpLoginId;
    @Value("${ftp.password}")
    private String ftpPassword;
    @Value("${ftp.port}")
    private int ftpPort;

    /**
     * FTP上传图片到服务器
     * @param file 图片
     * @param filePath 保存目录
     * @return true:图片名 / false:null
     * @throws IOException IO报错
     */
    public String uploadImage(MultipartFile file, String filePath) throws IOException {
        Date date = new Date();
        String filename = "img" + date.getTime() + ".png";
        /*   IP   端口   账号   密码   根路径   保存目录   保存文件名   图片   */
        boolean result = FileUtil.uploadFile(ftpUrl, ftpPort, ftpLoginId, ftpPassword, "", filePath, filename, file.getInputStream());
        if (result) {
            return filename;
        } else {
            return null;
        }
    }

}
(3)应用层Controller
package com.xxx.xxxxxx.controller;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.xxx.xxxxxx.service.thirdparty.FileService;
import com.xxx.xxxxxx.result.Result;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@Api(tags = "文件上传")
@RequiredArgsConstructor
public class FileController {

    private final FileService fileService;

    @ApiOperation(value = "上传图片", notes = "上传图片到ftp,上传成功后返回图片名称")
    @PostMapping("/ftpUpload/image")
    public Result<String> uploadImageInMgt(MultipartFile file) throws IOException {
        String filePath = "images";
        String result = fileService.uploadImage(file, filePath);
        if (!StringUtils.isBlank(result)) {
            return ResultUtils.success(filePath + "/" + result, "上传成功");
        } else {
            return ResultUtils.error(10001, "上传失败");
        }
    }

}
package com.xx.xxxxxx.result;

import lombok.Data;

@Data
public class Result<T> {

    private int code;

    private String message;

    private T data;

}

配置服务器端FTP

1.宝塔系统

直接在FTP管理区域,添加FTP,设置账号密码和上传图片的目录即可

2.Windows系统

Windows系统服务器,安装VS FTP Windows版本。
我自己也是只有安装包,以前公司用的,有需要可以到我百度网盘下载,很小的文件,下载很快。
链接:https://pan.baidu.com/s/1r1aAQNNAYSvK3BOmyhBV8Q
提取码:o2cb
在这里插入图片描述
以上是本文全部内容,感谢查看!
欢迎参考,感谢指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶清杉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值