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
以上是本文全部内容,感谢查看!
欢迎参考,感谢指正!