controller 類
@PostMapping(value = "uploadImg")
@ResponseBody
public Object uploadImg(MultipartFile[] files){
return new DataResult("保存成功!",StatusCode.SUCCESS.getCode(),service.uploadImage(files));
}
service類:
配置文件裏:
ImageUpload:
address: /usr/local/nginx/html/images/
imageport: 8088
server: 192.168.7.109
FTP_PORT: 21
FTP_USERNAME: root
FTP_PASSWORD: root
@Service
public class ImageConfigService {
private Logger log=LogManager.getLogger(ImageConfigService.class);
@Value("${ImageUpload.FTP_PORT}")
private String ftpPort ;
@Value("${ImageUpload.FTP_USERNAME}")
private String ftpUsername ;
@Value("${ImageUpload.FTP_PASSWORD}")
private String ftpPassword ;
@Value("${ImageUpload.address}")
String imageAddress;
@Value("${ImageUpload.imageport}")
private String imageport;
@Value("${ImageUpload.server}")
private String server;
@Value("${spring.datasource.primary.driverClassName}")
String driverName;
@Resource
@Qualifier("primaryJdbcTemplate")
JdbcTemplate jdbcTemplate;
public Object uploadImage(MultipartFile[] files) {
String tableName=getTableName("gsa_data_homeimage");
Map<String, String> resObj = new HashMap<>();
String urlImage="";
try {
String images="";
for(MultipartFile file:files) {
String path = "homeImage/";//存儲路徑+file.getOriginalFilename()
urlImage="http://"+server+":"+imageport+"/images/homeImage/"+file.getOriginalFilename();
log.info("urlImage:"+urlImage);
FtpUtil.uploadFile(server, ftpPort, ftpUsername, ftpPassword, imageAddress, path, file.getOriginalFilename(), file.getInputStream());
images+=urlImage+",";
}
images=images.substring(0,images.length()-1);
String sql="insert into "+tableName+"(imageurl,createtime) values('"+images+"','"+DateUtil.format()+"')";
jdbcTemplate.execute(sql);
} catch (IOException e) {
e.printStackTrace();
}
return resObj;
}
}
FtpUtil 工具類:
public class FtpUtil {
/**
* 得到真實文件名
*
* @param fileName
* @return
*/
public static String subFileName(String fileName) {
// 查找最後一個 \ (文件分隔符)位置
int index = fileName.lastIndexOf(File.separator);
if (index == -1) {
// 沒有分隔符,說明是真實名稱
return fileName;
} else {
return fileName.substring(index + 1);
}
}
/**
* 獲得隨機UUID文件名
*
* @param fileName
* @return
*/
public static String generateRandonFileName(String fileName) {
// 首相獲得擴展名,然後生成一個UUID碼作爲名稱,然後加上擴展名
String ext = fileName.substring(fileName.lastIndexOf("."));
return UUID.randomUUID().toString() + ext;
}
public static String generateRandonFileName() {
return UUID.randomUUID().toString();
}
/**
* 獲得hashcode 生成二級目錄
*
* @param uuidFileName
* @return
*/
public static String generateRandomDir(String uuidFileName) {
int hashCode = uuidFileName.hashCode();// 得到它的hashcode編碼
// 一級目錄
int d1 = hashCode & 0xf;
// 二級目錄
int d2 = (hashCode >> 4) & 0xf;
return "/" + d1 + "/" + d2;
}
/**
* Description: 向FTP服務器上傳文件
*
* @param host
* FTP服務器hostname
* @param port
* FTP服務器端口
* @param username
* FTP登錄賬號
* @param password
* FTP登錄密碼
* @param basePath
* FTP服務器基礎目錄
* @param filePath
* FTP服務器文件存放路徑。
* @param filename
* 上傳到FTP服務器上的文件名
* @param input
* 輸入流
* @return 成功返回true,否則返回false
*/
public static boolean uploadFile(String host, String ftpPort, String username, String password, String basePath,
String filePath, String filename, InputStream input) {
int port = Integer.parseInt(ftpPort);
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);
ftp.enterLocalPassiveMode();// 這個設置允許被動連接--訪問遠程ftp時需要
// 上傳文件
if (!ftp.storeFile(filename, input)) {
return result;
}
reply = ftp.getReplyCode();
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}}
解決 vsftp上傳553 Could not create file錯誤 https://blog.csdn.net/u010194538/article/details/80481691
553還有可能就是沒有權限,如果是別人搭建的ftp可能會設置只給某個路徑有權限,其它路徑都上傳不了
先運行getsebool -a | grep ftp (查看selinux裏有哪些關於ftp的)
allow_ftpd_anon_write –> off
allow_ftpd_full_access –> off
allow_ftpd_use_cifs –> off
allow_ftpd_use_nfs –> off
ftp_home_dir –> off
ftpd_connect_db –> off
httpd_enable_ftp_server –> off
sftpd_anon_write –> off
sftpd_enable_homedirs –> off
sftpd_full_access –> off
sftpd_write_ssh_home –> off
tftp_anon_write –> off
接下來我們allow_ftpd_anon_write allow_ftpd_full_access 這兩個ON掉。
setsebool -P allow_ftpd_anon_write on
setsebool -P allow_ftpd_full_access on
參考下面這個地址,有各種文件狀態碼說明,解決連接不上ftp的錯誤