上传图片到服务器:
我遇到的相关问题,在末尾有总结
1、在application.yml配置文件中添加,FTP配置信息
#ftp相关配置
FTP:
ADDRESS: 192.168.服务器ip
PORT: 22
USERNAME: administrator
PASSWORD: 123456
basePATH: /imes/file
servlet:
multipart:
# 单个文件大小
max-file-size: 512MB
# 设置总上传的文件大小
max-request-size: 1024MB
IMAGE:
base:
URL: http://192.168.服务器ip/imes/file
2、写一个FTP工具类,用来连接服务器,上传文件到指定目录:
public class FtpUtils {
private static ChannelSftp sftp = null;
public static boolean uploadFile(String host, int port, String username, String password, String basePath, String filename, InputStream input, MultipartFile uploadFile) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
JSch jsch = new JSch();
//获取sshSession 账号-ip-端口
Session sshSession = jsch.getSession(username, host, port);
//添加密码
sshSession.setPassword(password);
Properties sshConfig = new Properties();
//严格主机密钥检查
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
//开启sshSession链接
sshSession.connect();
//获取sftp通道
Channel channel = sshSession.openChannel("sftp");
//开启
channel.connect();
sftp = (ChannelSftp) channel;
//进入服务器主导模式
ftp.enterLocalPassiveMode();
//设置上传文件的类型为二进制类型
//进入到要上传的目录 然后上传文件
sftp.cd(basePath);
sftp.put(input, filename);
input.close();
result = true;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
3、写一个工具类去调用,这个上边的FTP工具类:
public static baseResponse pictureUpload(MultipartFile uploadFile) {
try {
//获得文件名,其他属性,一般用不上,建议直接跳到获取io流
String oldName = uploadFile.getOriginalFilename();
//1.2使用IDUtils工具类生成新的文件名,新文件名 = newName + 文件后缀
String newName = IDUtils.genImageName() + oldName.substring(oldName.lastIndexOf("."));
//把文件的信息填入file对象
FilePo filePo = new FilePo();
filePo.setOldName(oldName);
filePo.setNewName(newName);
filePo.setFileType(type);
filePo.setFileUrl(FTPenums.BATH_URL.getValue() + Fileenums.getDesc(code) + newName);
//获取 上传的io流
InputStream input = uploadFile.getInputStream();
//调用FtpUtil工具类进行上传
//注:我这里调用方法,使用的参数,是我调用的枚举值,你们使用的话,直接上传相应的参数即可
boolean result = FtpUtils.uploadFile(FTPenums.HOST.getValue(), Integer.parseInt(FTPenums.PORT.getValue()), FTPenums.USERNAME.getValue(),
FTPenums.PASSWORD.getValue(), FTPenums.base_PATH.getValue() + Fileenums.getDesc(code), newName, input, uploadFile);
if (result) {
//我这里还要把,文件地址,和名字存进数据库,看需求
//这个地方可能会出现找不到mapper文件的情况,可以看我的上一篇博客,工具类找不到mapper文件的解决方法
fileUTils.fileMapper.insert(filePo);
return baseResponse.buildSuccessfulResponse(filePo.getId());
} else {
return baseResponse.buildFailedResponse("上传失败");
}
} catch (IOException e) {
return baseResponse.buildFailedResponse("IO异常");
}
}
注:1、这个需要先在服务端建立文件夹
2、工具类调用mapper可能会出错,可查看该博客
3、这个方法所用的服务器,如果是一个盘就没问题。我这边使用的是一个主机服务器,windows,有三个盘,每次默认进的就是c盘,我的解决方法是basepath路径前边加上 /e:image/,这样就可以存到e盘。



