java 上傳文件到Linux服務器 工具類


最近在幫同學做一個音樂推薦系統后台,需要java遠程調用Linux服務器,執行深度學習算法,處理由本地上傳的文件。查找了相關的資料,利用ftpClient上傳文件到服務器。在此貼一下這個助手類(網上很多)。

import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.*;

/**
* JAVA FTPClient 工具類
*
* commons-net-1.4.1.jar PFTClinet jar包
*
* @author : hpp
*/
public class FtpClientUtils{

/**
* Description: 向FTP服務器上傳文件
* @Version1.0
* @param url FTP服務器hostname
* @param port FTP服務器端口
* @param username FTP登錄賬號
* @param password FTP登錄密碼
* @param path FTP服務器保存目錄
* @param filename 上傳到FTP服務器上的文件名
* @param input 輸入流
* @return 成功返回true,否則返回false
*/
public static boolean uploadFile(
String url,//FTP服務器hostname
int port,//FTP服務器端口
String username, // FTP登錄賬號
String password, //FTP登錄密碼
String path, //FTP服務器保存目錄
String filename, //上傳到FTP服務器上的文件名
InputStream input // 輸入流
) {
boolean success = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(url, port);//連接FTP服務器
//如果采用默認端口,可以使用ftp.connect(url)的方式直接連接FTP服務器
ftp.login(username, password);//登錄
reply = ftp.getReplyCode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
System.out.println("FTP服務器 拒絕連接");
return success;
}
ftp.changeWorkingDirectory(path);
ftp.storeFile(filename, input);

input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}

/**
* 刪除文件
* @param fileName 要刪除的文件地址
* @return true/false
* @throws IOException
*/
public static boolean delete(String fileName, FTPClient ftpClient) throws IOException {
return ftpClient.deleteFile(fileName);
}


/**
* 下載文件到指定目錄
* @param ftpFile 文件服務器上的文件地址
* @param dstFile 輸出文件的路徑和名稱
* @throws Exception
*/
public static void downLoad(String ftpFile, String dstFile, FTPClient ftpClient) throws Exception {
if (StringUtils.isBlank(ftpFile)) {
throw new RuntimeException("ftpFile為空");
}
if (StringUtils.isBlank(dstFile)) {
throw new RuntimeException("dstFile為空");
}
File file = new File(dstFile);
FileOutputStream fos = new FileOutputStream(file);
ftpClient.retrieveFile(ftpFile, fos);
fos.flush();
fos.close();
}

/**
* 從文件服務器獲取文件流
* @param ftpFile 文件服務器上的文件地址
* @return {@link InputStream}
* @throws IOException
*/
public static InputStream retrieveFileStream(String ftpFile, FTPClient ftpClient) throws IOException {
if (StringUtils.isBlank(ftpFile)) {
throw new RuntimeException("ftpFile為空");
}
return ftpClient.retrieveFileStream(ftpFile);
}

public static void main(String[] args) {
try {
FileInputStream in=new FileInputStream(new File("F:\\istep\\istep\\src\\main\\webapp\\recordFiles\\333.mp3"));
boolean flag = uploadFile("XXX.XXX.XXX.XXX", 21, "userName", "password", "/home/tomcat-istep-8787/webapps/istep/videoPlay/", "333.mp3", in);
System.out.println(flag);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

測試的時候可以打印一下reply,根據不同的reply可以判斷不同的登錄失敗原因,我自己遇到的是返回530、賬號密碼都正確。

原因是:root賬號沒有上傳文件的權限。

解決方法:http://blog.csdn.net/chuweiguo789/article/details/44015529

============以下轉載自:http://blog.csdn.net/chuweiguo789/article/details/44015529 ===================

1:先看      Linux服務器的防火牆關了      沒。service iptables stop 關閉防火牆。這算一個錯誤。      
2:若是防火牆關了,還報此錯誤。你可以繼續排查。看      linux是否有ftp服務      。      
    你可以使用 service vsftpd status 來查看ftp是否開啟。(vsftpd is running...,是說明目前ftp是開啟狀態),chkconfig --list vsftpd 也是查看ftp服務是否開啟(netstat -tnl也可以查詢21端口是否開啟)。      
    也可以使用ps -ef | grep ftp 來查看本地是否含有包含ftp的進程開啟。(看ftp22端口是否使用)。      
    總之第二個原因就是服務器是否有ftp服務。若沒有你要自己安裝ftp服務器,若有,而是沒有啟動你可以啟動ftp服務(使用service vsftpd start 啟動 或者 service vsftpd restart 重啟)。      
      (三):就是你連接上了,只是ftpClient.getReplyCode()的返回值是530,那么就是因為你當前用戶沒有傳輸文件的權限,先提供如下解決辦法。      
      一般root用戶是有權限的若是root還返回530,就用一下方法:先查看/etc/vsftpd/下面的文件ftpusers和user_list里面是否有你的用戶名,若有注釋就可以了。這兩個文件中的用戶都是沒有權限。(我就是這么解決的)  
      給用戶添加ftp權限:以下步驟是在網上搜的沒有親測,大家可以試試。      
      在linux中添加ftp用戶,並設置相應的權限,操作步驟如下:      
1、環境:ftp為vsftp。被限制用戶名為test。被限制路徑為/home/test      
      2、建用戶:在root用戶下:      
useradd -d /home/test test //增加用戶test,並制定test用戶的主目錄為/home/test      
      passwd test //為test設置密碼      
3、更改用戶相應的權限設置:      
usermod -s /sbin/nologin test //限定用戶test不能telnet,只能ftp      
      usermod -s /sbin/bash test //用戶test恢復正常      
usermod -d /test test //更改用戶test的主目錄為/test      
      4、限制用戶只能訪問/home/test,不能訪問其他路徑      
      修改/etc/vsftpd/vsftpd.conf如下:      
chroot_list_enable=YES //限制訪問自身目錄      
# (default follows)      
      chroot_list_file=/etc/vsftpd/vsftpd.chroot_list      
編輯 vsftpd.chroot_list文件,將受限制的用戶添加進去,每個用戶名一行      
      改完配置文件,不要忘記重啟vsFTPd服務器      
[root@linuxsir001 root]# /etc/init.d/vsftpd restart      
      5、如果需要允許用戶修改密碼,但是又沒有telnet登錄系統的權限:      
usermod -s /usr/bin/passwd test //用戶telnet后將直接進入改密界面      
      看到230,恭喜你。總算大功告成了!!!哎、、、不容易哈!      
      最后附上ftpClient.getReplyCode()的返回值的對應信息:      
110  重新啟動標記應答。在這種情況下文本是確定的,它必須是:MARK   yyyy=mmmm,其中yyyy是用戶進程數據流標記,mmmm是服務器標記。           
120     服務在nnn分鍾內准備好           
125     數據連接已打開,准備傳送           
150     文件狀態良好,打開數據連接           
200     命令成功           
202     命令未實現           
211     系統狀態或系統幫助響應           
212     目錄狀態           
213     文件狀態           
214     幫助信息,信息僅對人類用戶有用           
215     名字系統類型           
220     對新用戶服務准備好           
221     服務關閉控制連接,可以退出登錄           
225     數據連接打開,無傳輸正在進行           
226     關閉數據連接,請求的文件操作成功           
227     進入被動模式           
230     用戶登錄           
250     請求的文件操作完成           
257     創建 "PATHNAME "           
      331     用戶名正確,需要口令           
332     登錄時需要帳戶信息           
350     請求的文件操作需要進一步命令           
421     不能提供服務,關閉控制連接           
425     不能打開數據連接           
426     關閉連接,中止傳輸           
450     請求的文件操作未執行           
451     中止請求的操作:有本地錯誤           
452     未執行請求的操作:系統存儲空間不足           
500     格式錯誤,命令不可識別           
501     參數語法錯誤           
502     命令未實現           
503     命令順序錯誤           
504     此參數下的命令功能未實現           
530     未登錄(用戶名或密碼錯誤,1、FTP密碼修改了?2、用戶名/密碼輸入錯誤?先仔細檢查有無輸入錯誤   如復制的時候誤復制了空格!!)           
532     存儲文件需要帳戶信息           
550     未執行請求的操作           
551     請求操作中止:頁類型未知           
552     請求的文件操作中止,存儲分配溢出           
553     未執行請求的操作:文件名不合法   


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com