網站首頁 編程語言 正文
上傳文件
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上傳的所有內容了,如果對你有幫助請點個贊
原文鏈接:https://blog.csdn.net/aaa58962458/article/details/121038457
相關推薦
- 2022-10-20 C++分析如何用虛析構與純虛析構處理內存泄漏_C 語言
- 2022-02-15 使用數組的sort方法完成項目中的排序功能(數組sort方法與chart圖表展示結合)
- 2022-03-15 could not open extension control file “/usr/pgsql-
- 2022-09-13 cmd命令打開及切換目錄路徑的實現_DOS/BAT
- 2022-04-11 python寫入Excel表格的方法詳解_python
- 2022-05-10 SpringMVC學習Controller注解以及restful風格
- 2022-06-18 C#如何綁定多個按鈕到同一個事件_C#教程
- 2024-01-16 關于jquery中的ajax 網絡異常失敗回調函數
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支