安裝vsftp
1归园、首先,安裝vsftpd
yum -y install vsftpd
2、驗證是否安裝成功
rpm -qa vsftpd
3砸狞、查看vsftp相關(guān)配置文件
ll /etc/vsftpd/
vsftpd.conf
文件是主要的配置文件,一些關(guān)鍵的配置都在其中
ftpusers
文件是禁止使用vsftpd的用戶列表文件镀梭,記錄不允許訪問FTP服務(wù)器的用戶名單
user_list
這個文件禁止或允許使用vsftpd的用戶列表文件刀森,這個文件中指定的用戶缺省情況(即在vsftpd.conf
中設(shè)置userlist_deny=YES
)下也不能訪問FTP服務(wù)器,在設(shè)置了userlist_deny=NO
時报账,僅允許user_list
中指定的用戶訪問FTP服務(wù)器
4研底、先備份一份vsftpd.conf文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd-default.conf
5、修改vsftpd.conf配置文件
vim /etc/vsftpd/vsftpd.conf
把anonymous_enable=YES
改為NO
透罢,表示不允許匿名訪問
然后把listen=NO
改為YES
飘哨,listen_ipv6=YES
改為NO
再在該文件的最后添加以下數(shù)據(jù):
#僅允許user_list文件中的用戶訪問FTP服務(wù)
userlist_deny=NO
#被動模式端口范圍
pasv_min_port=30000
pasv_max_port=30999
6、創(chuàng)建一個用來登錄FTP服務(wù)的用戶
useradd ftpuser
passwd ftpuser
#輸入兩次密碼
7琐凭、將ftpuser用戶加進(jìn)user_list文件最后一行
vim /etc/vsftpd/user_list
8芽隆、啟動FTP服務(wù)
systemctl start vsftpd
9、服務(wù)器開放21端口和30000/30999端口范圍
10统屈、瀏覽器訪問測試是否成功:
ftp://服務(wù)器ip地址/
Nginx進(jìn)行配置
打開nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
修改以下內(nèi)容
重啟nginx:
cd /usr/local/nginx/sbin/
./nginx -s reload
服務(wù)器開放端口:9999
Java實現(xiàn)上傳圖片的功能
1胚吁、添加依賴:
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
2、application.properties配置文件添加以下內(nèi)容:
#配置文件上傳器
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
#ftp相關(guān)配置
#服務(wù)器地址
FTP.ADDRESS=192.168.xx.xxx
#FTP服務(wù)端口,默認(rèn)是21
FTP.PORT=21
#訪問FTP服務(wù)的用戶名
FTP.USERNAME=ftpuser
#訪問FTP服務(wù)的用戶名對應(yīng)的密碼
FTP.PASSWORD=ftpuser
#圖片存放在服務(wù)器指定的文件夾
FTP.BASEPATH=/home/ftpuser/images
#訪問圖片的基本url愁憔,如果端口號為80就不用加端口,192,168.xx.xxx為服務(wù)器ip地址
IMAGE.BASE.URL=http://192.168.xx.xxx:9999/images
3腕扶、FtpUtils:用于上傳文件的工具類
public class FtpUtil {
/**
* Description: 向FTP服務(wù)器上傳文件
* @param host FTP服務(wù)器ip
* @param port FTP服務(wù)器端口
* @param username FTP登錄賬號
* @param password FTP登錄密碼
* @param basePath FTP服務(wù)器基礎(chǔ)目錄,/home/ftpuser/images
* @param filename 上傳到FTP服務(wù)器上的文件名
* @param input 輸入流
* @return 成功返回true,否則返回false
*/
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);// 連接FTP服務(wù)器
// 如果采用默認(rèn)端口吨掌,可以使用ftp.connect(host)的方式直接連接FTP服務(wù)器
ftp.login(username, password);// 登錄
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
//設(shè)置為被動模式
ftp.enterLocalPassiveMode();
//設(shè)置編碼格式為utf-8
ftp.setControlEncoding("UTF-8");
//設(shè)置上傳文件的類型為二進(jìn)制類型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//設(shè)置存儲圖片的文件夾
ftp.changeWorkingDirectory(basePath);
//上傳文件
if (!ftp.storeFile(filename, input)) {
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;
}
}
4半抱、用于生成隨機圖片名
public class IDUtils {
/**
* 生成隨機圖片名
*/
public static String genImageName() {
//取當(dāng)前時間的長整形值包含毫秒
long millis = System.currentTimeMillis();
//long millis = System.nanoTime();
//加上三位隨機數(shù)
Random random = new Random();
int end3 = random.nextInt(999);
//如果不足三位前面補0
String str = millis + String.format("%03d", end3);
return str;
}
}
5、上傳圖片的Controller
/**
* 上傳圖片
*/
@Controller
@RequestMapping("/admin")
public class UploadController {
@Value("${FTP.ADDRESS}")
private String host;
// 端口
@Value("${FTP.PORT}")
private int port;
// ftp用戶名
@Value("${FTP.USERNAME}")
private String userName;
// ftp用戶密碼
@Value("${FTP.PASSWORD}")
private String passWord;
// 文件在服務(wù)器端保存的主目錄
@Value("${FTP.BASEPATH}")
private String basePath;
// 訪問圖片時的基礎(chǔ)url
@Value("${IMAGE.BASE.URL}")
private String baseUrl;
/**
* 上傳圖片到服務(wù)器
* @param uploadFile
* @return
*/
@PostMapping("/upload/file")
public String pictureUpload(@RequestParam("file") MultipartFile file) {
try {
//1膜宋、給上傳的圖片生成新的文件名
//1.1獲取原始文件名
String oldName = file.getOriginalFilename();
//1.2使用IDUtils工具類生成新的文件名窿侈,新文件名 = newName + 文件后綴
String newName = IDUtils.genImageName();
newName = newName + oldName.substring(oldName.lastIndexOf("."));
//2、把圖片上傳到圖片服務(wù)器
//2.1獲取上傳的io流
InputStream input = file.getInputStream();
//2.2調(diào)用FtpUtil工具類進(jìn)行上傳
boolean result = FtpUtil.uploadFile(host, port, userName, passWord, basePath, newName, input);
if(result) {
//返回給前端圖片訪問路徑
return baseUrl+"/"+newName;
}else {
return "false";
}
} catch (IOException e) {
e.printStackTrace();
return "false";
}
}
}
6秋茫、測試
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/admin/upload/file" enctype="multipart/form-data" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
7史简、提交圖片后后端會返回一個圖片路徑,復(fù)制到地址欄看看是否能訪問
到此肛著,使用java上傳圖片就完成了圆兵。