導語:文件上傳一般都是直接上傳tomcat發佈的機器上,而後依賴tomcat暴露,由此會引起一個問題,當tomcat更換位置、或者重啓會清空環境,上傳的文件就沒有了,另外一個就是開發階段文件會上傳到各自的服務器,不便於調試。java
1、安裝linux
¬ 查看是否安裝:rpm –qa|grep vsftpd
¬ 安裝vsftpd:yum install –y vsftpd
¬ 查看vsftpd狀態:service vsftpd status
¬ 啓動vsftpd:service vsftpd start
¬ vsftpd配置文件:vi /etc/vsftpd/vsftpd.conf
配置注意事項:
開放端口或關閉防火牆: iptables 20、21
設置selinux iptables:查看狀態 getenforce
修改狀態 vi /etc/sysconfig/selinux selinux = disabled(重啓)
單次關閉 setenforce 0 (不須要重啓)
匿名帳戶設置:
anon_umask = 777 //匿名用戶的權限配置
anonymous_enable = yes //容許匿名登陸
anon_mkdir_write_enable = yes //匿名用戶擁有建立文件夾的權限
anon_other_write_enable = yes //匿名用戶擁有寫權限
write_enable = yes //必須配置爲yes,匿名用戶才擁有寫的權限
登陸:
user:ftp
password:任何字段
本地帳戶
local_umask = 072 //配置權限,權限值恰好相反
write_enable = yes //本地用戶擁有寫權限
local_enable = yes //容許本地用戶登陸
2、參數詳解apache
參數 | 說明 |
listen_address=ip address | 指定偵聽IP |
listen_port=port_value | 指定偵聽端口,默認21 |
anonymous_enable=YES | 是否容許使用匿名賬戶 |
local_enable=YES | 是否容許本地用戶登陸 |
nopriv_user=ftp | 指定vsftpd服務的運行賬戶,不指定時使用ftp |
write_enable=YES | 是否容許寫入 |
anon_upload_enable=YES | 匿名用戶是否可上傳文件 |
anon_mkdir_write_enable=YES | 匿名用戶是否創建目錄 |
dirmessage_enable=YES | 進入每一個目錄是顯示歡迎信息,在每一個目錄下創建.message文件在裏面寫歡迎信息 |
xferlog_enable=YES | 上傳/下載文件時記錄日誌 |
connect_from_port_20=YES | 是否使用20端口傳輸數據(是否使用主動模式) |
chown_uploads=YES、chown_username=whoever | 修改匿名用戶上傳文件的擁有者 |
xferlog_file=/var/log/vsftpd.log | 日誌文件 |
xferlog_std_format=YES | 使用標準文件日誌 |
idle_session_timeout=600 | 會話超時,客戶端鏈接到ftp但未操做 |
data_connection_timeout=120 | 數據傳輸超時 |
async_abor_enable=YES | 是否容許客戶端使用sync等命令 |
ascii_upload_enable=YES、ascii_download_enable=YES | 是否容許上傳/下載二進制文件 |
chroot_local_user=YES | 限制全部的本地用戶在自家目錄 |
chroot_list_enable=YES、chroot_list_file=/etc/vsftpd/chroot_list | 指定不能離開家目錄的用戶,將用戶名一個一行寫在/etc/vsftpd/chroot_list文件裏,使用此方法時必須chroot_local_user=NO |
ls_recurse_enable=YES | 是否容許使用ls -R等命令 |
listen=YES | 開啓ipv4監聽 |
listen_ipv6=YES | 開啓ipv6監聽 |
pam_service_name=vsftpd | 使用pam模塊控制,vsftpd文件在/etc/pam.d目錄下 |
userlist_enable=YES | 此選項被激活後,vsftpd將讀取userlist_file參數所指定的文件中的用戶列表。當列表中的用戶登陸FTP服務器時,該用戶在提示輸入密碼以前就被禁止了。即該用戶名輸入後,vsftpd查到該用戶名在列表中,vsftpd就直接禁止掉該用戶,不會再進行詢問密碼等後續步聚 |
userlist_deny=YES | 決定禁止仍是隻容許由userlist_file指定文件中的用戶登陸FTP服務器。此選項在userlist_enable 選項啓動後才生效。YES,默認值,禁止文件中的用戶登陸,同時也不向這些用戶發出輸入密碼的提示。NO,只容許在文件中的用戶登陸FTP服務器 |
tcp_wrappers=YES | 是否容許tcp_wrappers管理 |
local_root=/home/ftp | 全部用戶的根目錄,,對匿名用戶無效 |
anon_max_rate | 匿名用戶的最大傳輸速度,單位是Byts/s |
local_max_rate | 本地用戶的最大傳輸速度,單位是Byts/s |
download_enable= YES | 是否容許下載 |
# 容許本地用戶登陸
local_enable=YES
# 本地用戶的寫權限
write_enable=YES
# 使用FTP的本地文件權限,默認爲077
# 通常設置爲022
local_umask=022
# 切換目錄時
# 是否顯示目錄下.message的內容
dirmessage_enable=YES
dirlist_enable = NO
#驗證方式
#pam_service_name=vsftpd
# 啓用FTP數據端口的數據鏈接
connect_from_port_20=YES
# 以獨立的FTP服務運行
listen=yes
# 修改鏈接端口
#listen_port=2121
######### 匿名登陸設置 ###########
# 容許匿名登陸
anonymous_enable=NO
# 若是容許匿名登陸
# 是否開啓匿名上傳權限
#anon_upload_enable=YES
# 若是容許匿名登陸
# 是否容許匿名創建文件夾並在文件夾內上傳文件
#anon_mkdir_write_enable=YES
# 若是容許匿名登陸
# 匿名賬號能夠有刪除的權限
#anon_other_write_enable=yes
# 若是容許匿名登陸
# 匿名的下載權限
# 匿名爲Other,可設置目錄/文件屬性控制
#anon_world_readable_only=no
# 若是容許匿名登陸
# 限制匿名用戶傳輸速率,單位bite
#anon_max_rate=30000
######### 用戶限制設置 ###########
#### 限制登陸
# 用userlist來限制用戶訪問
#userlist_enable=yes
# 名單中的人不容許訪問
#userlist_deny=no
# 限制名單文件放置的路徑
#userlist_file=/etc/vsftpd/userlist_deny.chroot
#### 限制目錄
# 限制全部用戶都在家目錄
#chroot_local_user=yes
# 調用限制在家目錄的用戶名單
chroot_list_enable=YES
# 限制在家目錄的用戶名單所在路徑
chroot_list_file=/etc/vsftpd/chroot_list
######### 日誌設置 ###########
# 日誌文件路徑設置
xferlog_file=/var/log/vsftpd.log
# 激活上傳/下載的日誌
xferlog_enable=YES
# 使用標準的日誌格式
#xferlog_std_format=YES
######### 安全設置 ###########
# 用戶空閒超時,單位秒
#idle_session_timeout=600
# 數據鏈接空閒超時,單位秒
#data_connection_timeout=120
# 將客戶端空閒1分鐘後斷開
#accept_timeout=60
# 中斷1分鐘後從新鏈接
#connect_timeout=60
# 本地用戶傳輸速率,單位bite
#local_max_rate=50000
# FTP的最大鏈接數
#max_clients=200
# 每IP的最大鏈接數
#max_per_ip=5
######### 被動模式設置 ###########
# 是否開戶被動模式
pasv_enable=yes
# 被動模式最小端口
pasv_min_port=5000
# 被動模式最大端口
pasv_max_port=6000
3、FtpUtil工具類tomcat
package com.guduo.common.utils.ftp; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import com.guduo.common.utils.string.StringUtil; /** * Ftp:遠程操做文件服務器(FTP鏈接、建立文件夾、刪除文件、上傳文件、下載文件) * @author Liugp * */ public class FtpUtil { private static FTPClient ftpClient = new FTPClient(); private String hostname="192.168.1.61"; private String port="80"; private String username="ftpUser"; private String password="ftpUser"; /** * FTP 鏈接登陸 * @param hostname * @param port * @param username * @param password * @return * @throws IOException */ public static boolean connect() throws IOException { ftpClient.connect(hostname, port); if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { if (ftpClient.login(username, password)) { return true; }else{ ftpClient.logout(); ftpClient.disconnect(); } } return false; } /** * 獲取ftp指定目錄下的文件列表 * @param tempDir:絕對路徑,例如("/usr/local") * @return */ public static FTPFile[] listFiles(String tempDir){ FTPFile[] ff = null; try { connect(); ftpClient.changeWorkingDirectory(tempDir); ff = ftpClient.listFiles(); //打印文件名 for(FTPFile file:ff){ if(file.isFile()) System.out.println(file.getName()); else if(file.isDirectory()) System.out.println(file.getName()); } } catch (IOException e) { return null; } disConnect(); return ff; } /** * 建立文件夾: * 存在,不建立 * 不存在,建立 * @param path:絕對路徑 * @param dirname:文件名 */ public static void createDir(String path,String dirname){ try{ //創建鏈接 connect(); //建立文件夾 if(StringUtil.isNotEmpty(path)) { ftpClient.changeWorkingDirectory(path); //建立多級目錄 String[] dirs = dirname.split("/"); for(String dir:dirs){ ftpClient.makeDirectory(dir); ftpClient.changeWorkingDirectory(dir); } } ftpClient.changeWorkingDirectory("/"+dirname); //斷開鏈接 // disConnect(); }catch(Exception ex){ System.out.println(ex.getMessage()); } } /** * 文件上傳 * @param path:上傳路徑 * @param name:文件名 * @param in:文件流 */ public static void ftpPut(String path,InputStream file,String name) { try{ //判斷文件夾是否存在,不存在建立 createDir("/home/ftpTest",path); //創建鏈接 connect(); //切換至上傳路徑 ftpClient.changeWorkingDirectory("/home/ftpTest/"+path); //設置二進制上傳 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //存儲文件 ftpClient.storeFile(name, file); //斷開鏈接 disConnect(); }catch(Exception ex){ System.out.println(ex.getMessage()); } } /** * 下載文件 * @param ftpPath:下載路徑加文件名 * @param localPath:本地保存路徑加文件名 */ public static void ftpDownload(String ftpPath,String localPath) { try { //創建鏈接 connect(); ftpClient.changeWorkingDirectory(ftpPath.substring(0, ftpPath.lastIndexOf("/"))); InputStream is = ftpClient.retrieveFileStream(ftpPath); File file = new File(localPath); FileOutputStream os = new FileOutputStream(file); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } is.close(); os.close(); //斷開鏈接 disConnect(); } catch (IOException e) { e.printStackTrace(); } } /** * 刪除文件 * @param filePath:絕對路徑 * @return */ public static boolean removeFile(String filePath){ boolean flag = false; if( ftpClient!=null ){ try { //創建鏈接 connect(); flag = ftpClient.deleteFile(filePath); //斷開鏈接 disConnect(); } catch (IOException e) { disConnect(); e.printStackTrace(); } } return flag; } /** * 關閉鏈接 */ public static void disConnect() { try { ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } }