上传文件
Controller层:
//图片类型校验
@Value("${picture.pictureType}")
private String pictureType;// pictureType: ^.+.(jpg|png|gif|webp)$
//图片大小校验
@Value("${file.limitSize}")
private String pictureSize;
/**
* @author bobo
* 上传图片信息
*/
@PostMapping("/insertTreeImage")
public AjaxResult insertTreeImage(@RequestBody MultipartFile file, @RequestParam("id") Long id) throws IOException {
//限制图片大小
String regex=pictureSize.replaceAll("[A-Z]{2}","");
Long limit=(Long.parseLong(regex))*1024;
Long size = file.getSize()/1024;
//限制图片类型
if(!file.getOriginalFilename().matches(pictureType)){
throw new BizException(BizCodeEnum.FILE_UPLOAD_TYPE_FAIL);
} else if (file.isEmpty() || file==null){//验证图片是否为空
throw new BizException(BizCodeEnum.FILE_UPLOAD_NOTFOUND_FAIL);
}else if(size>=limit){//限制图片大小
throw new BizException(BizCodeEnum.FILE_UPLOAD_SIZE_FAIL);
}else {
AjaxResult ajaxResult = ancientTreeService.uploadTreeImage(file, id);
return AjaxResult.success("操作成功",ajaxResult);
}
}
service层:
AjaxResult uploadTreeImage(MultipartFile file, Long id) throws IOException;
impl:
/**
* 上传图片的方法
* @param file
* @param id
* @author bobo
*/
@Override
public AjaxResult uploadTreeImage(@RequestBody MultipartFile file , Long id) throws IOException {
//获得图片原来的名称
String fileName=file.getOriginalFilename();
//防止上传后重名问题创建一个md5随机名称的文件夹
String uploadFileName= UUID.randomUUID().toString();
//按时间存放
String strNow = new SimpleDateFormat("yyyyMMdd").format(new Date()).toString();
String newFileName = uploadFileName;
//对文件夹名称进行拼接作为上传路径
String filePath="/"+ LitchiDirectoryName.AncientTreeDirName +"/"+strNow+"/"+newFileName;
//拼接地址作为上传路径
String url=nginxUrl+filePath+"/"+fileName;
//数据存入数据库
String address =filePath+"/"+fileName;
AncientTreeDO ancientTreeDO=new AncientTreeDO().setTreeImage(address).setId(id);
ancientTreeMapper.updateAncientTreePath(ancientTreeDO);
try {
//拿到输入流后传入ftp
InputStream input=null;
input = file.getInputStream();
/** 连接ftp进行上传
* ftpIp:自定义的ftpip地址
* port: 端口 (默认21)
* ftpUser: ftp用户名
* ftpPass:ftp密码
* basePath:上传后的根目录
* filePath:上传文件的文件路径
* fileName:上传后的文件名
* input:输入流数据
* **/
boolean b = FtpUtil.uploadFile(ftpIp, port, ftpUser, ftpPass, basePath, filePath, fileName, input);
if(b){
//返回url地址进行图片反显
return AjaxResult.success(url);
}else {
AjaxResult.error(425,"MESSAGE ERROR");
}
} catch (IOException e) {
log.error("文件上传异常",e);
}
return AjaxResult.success(nginxUrl);
}
FTP工具类:
public class FtpUtil {
/**
* Description: 向FTP服务器上传文件
*
* @param host FTP服务器ip
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录,/home/ftpuser/images
* @param filePath FTP服务器文件存放路径。例如分日期存放:/2018/05/28。文件的路径为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.setBufferSize(1024 * 1024 * 2);
BufferedInputStream bufferedInputStream = new BufferedInputStream(input);
ftp.enterLocalPassiveMode(); //设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE); //上传文件
if (!ftp.storeFile(filename, bufferedInputStream)) {
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;
}
}
以上就是FTP上传的所有内容了,如果对你有帮助请点个赞