Java操作Vsftpd文件服務器
-
使用ftp
Vsftpd文件服務器根路徑位於:/home/ftpuser
Nginx Web服務器根路徑位於:/home/ftpuser/shy/
-
啓動ftp服務
systemctl start vsftpd
-
啓動nginx
/usr/local/nginx/sbin/nginx
-
-
Java FTP文件上傳
-
引入依賴
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.3</version> </dependency>
-
編寫工具類
package com.shy.util; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.util.UUID; /** * 文件上傳工具類 */ public class FTPUtil { //日誌 private static Logger logger = LoggerFactory.getLogger(FTPUtil.class); /** * 文件上傳 * @param host 服務器IP * @param port 服務器端口 * @param username 服務器用戶名 * @param password 服務器密碼 * @param path 文件服務器路徑/年/月/日 * @param fileName 文件名 1.jpg * @param is 文件流 * @return */ public static String fileUpload(String host, int port, String username, String password, String path, String fileName, InputStream is){ //判斷操作是否正確 boolean flag = false; //返回的文件名 String remote = null; //創建ftp客戶端 FTPClient ftpClient = new FTPClient(); try { //設置編碼字符集 ftpClient.setControlEncoding("UTF-8"); //連接FTP服務器 ftpClient.connect(host,port); //登錄 flag = ftpClient.login(username,password); if (!flag){ logger.error("文件服務器用戶名或密碼錯誤"); return null; } //獲取登錄的狀態碼 int reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)){ ftpClient.disconnect(); return null; } /****************創建目錄,一次只能創建一個目錄****************/ String basePath = "/"; for (String p: path.split("/")){ basePath +=(p+"/"); //判斷目錄是否以及存在 boolean hasPath = ftpClient.changeWorkingDirectory(basePath); if (!hasPath){ //創建目錄,如果創建失敗一般都是權限問題 ftpClient.makeDirectory(basePath); } } //重新指定上傳的路徑 ftpClient.changeWorkingDirectory(path); /**********************************************************/ //指定上傳方式爲二進制方式 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); //得到文件後綴 String suffix = fileName.substring(fileName.lastIndexOf(".")); System.out.println("-----"+suffix); remote = UUIDUtil.getUUID()+suffix; // remote指定上傳遠程服務器的文件名 local指本地的輸入流 flag = ftpClient.storeFile(remote, is); if (!flag) { logger.error("文件上傳失敗,可能是權限,防火牆等問題"); return null; } }catch (IOException e){ logger.error("文件上傳錯誤,錯誤原因:" + e.getMessage()); }finally { try { if(is != null) is.close(); ftpClient.logout(); if(ftpClient.isConnected()) ftpClient.disconnect(); } catch (IOException e) { logger.error("文件上傳錯誤,錯誤原因:" + e.getMessage()); } } return remote; }
-
測試
public static void main(String[] arg) throws FileNotFoundException { InputStream is = new FileInputStream(new File("E://Images//timg.jpg")); fileUpload("192.168.40.100", 21, "ftpuser", "123456", "/home/ftpuser/shy/2019/09/10", "flower.jpg", is); } }
-
文件下載請參考