ftp上傳下載通用模板
- Controller層調(diào)用,返回FTP目錄相對(duì)地址
@RequestMapping("uploadImg")
@ResponseBody
public Map<String, Object> uploadImg(@RequestParam(value = "editormd-image-file", required = false) MultipartFile file) {
// Map<String, Object> result = new HashMap<>();
// // 獲取圖片原名稱
// String imgName = file.getOriginalFilename();
// // 圖片重命名
// String reImgName = UUIDUtils.getUUID(10) + imgName.substring(imgName.lastIndexOf("."));
// //保存
// try {
// byte[] bytes = file.getBytes();
// Path path = Paths.get(imagePath + reImgName);
// Files.write(path, bytes);
// result.put("success", 1);
// result.put("message", "上傳成功!");
// result.put("url", uploadImage + reImgName);
// } catch (Exception e) {
// result.put("success", 0);
// result.put("message", "上傳失??!");
// e.printStackTrace();
// }
// return result;
Map<String, Object> result = new HashMap<>();
try {
String url = ftpUtil.upload(file.getInputStream(), file.getOriginalFilename());
result.put("success", 1);
result.put("message", "上傳成功!");
result.put("url", "http://127.0.0.1:9999"+url);
} catch (IOException e) {
result.put("success", 0);
result.put("message", "上傳失?。?);
e.printStackTrace();
}
return result;
}
- FTP封裝的工具類
package com.typ.blog.utils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import sun.misc.BASE64Encoder;
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class FtpUtil {
//ftp服務(wù)器ip地址
String FTP_ADDRESS="127.0.0.1";//如果是自己買的服務(wù)器那就寫自己服務(wù)器的IP地址
//端口號(hào)
Integer FTP_PORT=21;
//用戶名
String FTP_USERNAME="ftptest";
//密碼
String FTP_PASSWORD="ftptest";
//圖片路徑
String FTP_BASEPATH="/var/ftp/test/";
/** 本地字符編碼 */
private static String LOCAL_CHARSET = "GBK";
// FTP協(xié)議里面,規(guī)定文件名編碼為iso-8859-1
private static String SERVER_CHARSET = "ISO-8859-1";
//根據(jù)當(dāng)前文件生成 文件夾
private static String getTimePath() {
Date now = new Date();
DateFormat format = new SimpleDateFormat("yyyy/MM/dd/");
return format.format(now);
}
/**
* author : wangwei
* description: 使用ftp 上傳文件
* date: 2019/6/5
*/
public String upload(InputStream inputStream, String originName) {
StringBuilder url = new StringBuilder();
FTPClient ftp = new FTPClient();
ftp.setControlEncoding("GBK");
try {
int reply;
ftp.connect(FTP_ADDRESS, FTP_PORT);// 連接FTP服務(wù)器
ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登錄
reply = ftp.getReplyCode();
System.out.println("reply:" + reply);
ftp.enterLocalPassiveMode();//開啟被動(dòng)模式,否則文件上傳不成功,也不報(bào)錯(cuò)
String timePath = getTimePath();
String saveDir = FTP_BASEPATH + timePath;
url.append(saveDir);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
createDir(ftp, saveDir);
originName = UUIDUtils.getUUID(10)+originName.substring(originName.lastIndexOf("."));
url.append(originName);
ftp.storeFile(originName, inputStream);
inputStream.close();
ftp.logout();
} catch (IOException e) {
throw new RuntimeException("文件上傳失敗");
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return url.toString();
}
/**
*
* 下載圖片轉(zhuǎn)換成Base64
* */
public String download(String ftpUrl,String sfzh){
FTPClient ftpClient = new FTPClient();
InputStream inputStream = null;
String re=null;
try {
ftpClient.connect(FTP_ADDRESS,FTP_PORT);
ftpClient.login(FTP_USERNAME, FTP_PASSWORD);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//是否成功登錄服務(wù)器
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
}
//跳轉(zhuǎn)到指定目錄
ftpClient.changeWorkingDirectory(ftpUrl);
//設(shè)置被動(dòng)模式,防止在Linux上,由于安全限制,可能某些端口沒有開啟,出現(xiàn)阻塞
ftpClient.enterLocalPassiveMode();
//讀取圖片需要添加該方法
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//5.遍歷下載的目錄
FTPFile[] fs = ftpClient.listFiles();
for (FTPFile ff : fs){
//解決中文亂碼問題,兩次解碼
// byte[] bytes=ff.getName().getBytes("iso-8859-1");
// String fileName=new String(bytes,"utf-8");
// if(sfzh.equals(fileName)){
// inputStream = ftpClient.retrieveFileStream(fileName);
// }
byte[] bytes=ff.getName().getBytes("iso-8859-1");
String fileName=new String(bytes,"utf-8");
inputStream = ftpClient.retrieveFileStream(fileName);
}
if (inputStream != null) {
byte[] data=null;
data=new byte[inputStream.available()];
inputStream.read(data);
BASE64Encoder encoder=new BASE64Encoder();
re=encoder.encode(data);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(ftpClient.isConnected()){
try{
ftpClient.disconnect();
}catch(IOException e){
e.printStackTrace();
}
}
if(null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return re;
}
// 創(chuàng)建文件夾,并切換到該文件夾
// 比如: hello/test
//最終會(huì)切換到test 文件夾返回
private void createDir(FTPClient client, String path) throws IOException {
String[] dirs = path.split("/");
for (String dir : dirs) {
if (StringUtils.isEmpty(dir)) {
continue;
}
if (!client.changeWorkingDirectory(dir)) {
client.makeDirectory(dir);
}
client.changeWorkingDirectory(dir);
}
}
}
-
項(xiàng)目實(shí)測(cè)
image.png -
顯示效果
image.png -
在FTP服務(wù)器中查看上傳的圖片文件(直接從瀏覽器中打開)
image.png
ps:記錄下載和上傳的實(shí)際調(diào)用
@CrossOrigin
public class FtpController {
@Autowired
FtpUtil fileUtil;//(就是上面的FTP封裝的工具類)
//圖片上傳
@PostMapping("/upload2")
public String uploadFile(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {
String url = fileUtil.upload(file.getInputStream(), file.getOriginalFilename());
return url;
}
//圖片下載轉(zhuǎn)base64
@GetMapping("/download")
public String download(HttpServletRequest request) throws IOException {
//ftp服務(wù)器的相對(duì)路徑 //圖片的名字
String url = fileUtil.download("var/ftp/test2021/03/17","1615967386819.jpg");
return url;
}
}


