vsftpd的搭建和nginx的搭建琐谤,
詳細可見blog.csdn.net/CSDN_LQR/article/details/53334583(轉(zhuǎn)載)。
這是一個相對完美的案列唇兑。可以放心食用审编。
但搭建好了拗胜,并不意味著就OK了。真真的重點來了檀训,
bug1.關(guān)于vsftpd的配置文件
anonymous_enable=NO(是否允許匿名訪問柑潦。YES:允許,NO:不允許)
local_enable=YES(本地用戶登錄峻凫。YES:允許渗鬼,NO:不允許)
local_umask=022(umask決定目錄和文件被創(chuàng)建時得到的初始權(quán)限
umask = 022時
? ? ? ? ? ? ? ? ? ? ? ? 新建的目錄 權(quán)限是755
? ? ? ? ? ? ? ? ? ? ? ? 文件的權(quán)限是 644
)
anon_upload_enable=YES(默認注釋掉了,允許匿名用戶上傳)
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
ascii_upload_enable=YES
ascii_download_enable=YES
allow_writeable_chroot=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
pam_service_name=vsftpd
check_shell=NO
userlist_file=/etc/vsftpd/user_list
userlist_enable=YES
tcp_wrappers=YES
userlist_deny=NO
seccomp_sandbox=NO
use_localtime=YES
listen_port=21
chroot_local_user=YES
idle_session_timeout=300
guest_enable=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd/vconf
data_connection_timeout=1
virtual_use_local_privs=YES
pasv_min_port=10060
pasv_max_port=10090
accept_timeout=5
connect_timeout=1
配置太多,具體每個配置的意義請自行查看荧琼,加深記憶譬胎。
bug2.通過 ftpclient 向 vsftpd 上傳圖片
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
/**
* ftp上傳下載工具類
*
*/
public class FtpUtil {
/**
* Description: 向FTP服務(wù)器上傳文件
*
* @param host
*? ? ? ? ? ? FTP服務(wù)器hostname
* @param port
*? ? ? ? ? ? FTP服務(wù)器端口
* @param username
*? ? ? ? ? ? FTP登錄賬號
* @param password
*? ? ? ? ? ? FTP登錄密碼
* @param basePath
*? ? ? ? ? ? FTP服務(wù)器基礎(chǔ)目錄
* @param filePath
*? ? ? ? ? ? FTP服務(wù)器文件存放路徑差牛。例如分日期存放:/2015/01/01。文件的路徑為basePath+filePath
* @param filename
*? ? ? ? ? ? 上傳到FTP服務(wù)器上的文件名
* @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服務(wù)器
// 如果采用默認端口偏化,可以使用ftp.connect(host)的方式直接連接FTP服務(wù)器
ftp.login(username, password);// 登錄
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
// 切換到上傳目錄
if (!ftp.changeWorkingDirectory(basePath + filePath)) {
// 如果目錄不存在創(chuàng)建目錄
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);
}
}
}
}
// 設(shè)置上傳文件的類型為二進制類型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(ftp.STREAM_TRANSFER_MODE);
// 上傳文件
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;
}
/**
* Description: 從FTP服務(wù)器下載文件
*
* @param host
*? ? ? ? ? ? FTP服務(wù)器hostname
* @param port
*? ? ? ? ? ? FTP服務(wù)器端口
* @param username
*? ? ? ? ? ? FTP登錄賬號
* @param password
*? ? ? ? ? ? FTP登錄密碼
* @param remotePath
*? ? ? ? ? ? FTP服務(wù)器上的相對路徑
* @param fileName
*? ? ? ? ? ? 要下載的文件名
* @param localPath
*? ? ? ? ? ? 下載后保存到本地的路徑
* @return
*/
public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
String fileName, String localPath) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
// 如果采用默認端口,可以使用ftp.connect(host)的方式直接連接FTP服務(wù)器
ftp.login(username, password);// 登錄
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(remotePath);// 轉(zhuǎn)移到FTP服務(wù)器目錄
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
File localFile = new File(localPath + "/" + ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
public static void main(String[] args) {
try {
FileInputStream in = new FileInputStream(new File("G:/BYSJ_Project/resource/up/a.jpg"));
System.out.println("in: " + in);
boolean flag = uploadFile("120.78.159.118", 21, "yx", "123456", "/home/vsftpd/yx/images/",
"/2015/09/21", "a.jpg", in);
System.out.println(flag);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
簡單實例镐侯,放心食用侦讨。
如果確定vsftpd搭建成功,用戶建立成功苟翻,java代碼環(huán)節(jié)也沒有錯韵卤。如果還是上傳圖片出錯,
那一定要檢查下防火墻(centos和windows),兩個都要檢查崇猫,都是坑