『壹』 java程序可以成功連接Ftp伺服器,但無法上傳文件,怎麼回事,報錯如下,(已設置連接超時時間200s)
我感覺有倆問題,1、連接地址和帳號不是一回事,你最好不要用域名做連接地址,可以用IP地址;2、你是在不行通過空間服務商進入線上後台,如果還不行就聯系空間商,可能是他們的問題.果是VPS的話好像要開通ftp某些許可權才可以,你只是開通了帳號,能連接,並沒有給ftp上傳下載的許可權,這個我在空間商裡面看過教程的,在這沒網路不讓發連接,你可以在網路搜一下試試,希望能幫助你。
『貳』 java實現ftp的斷點續傳問題
//嘗試移動文件內讀取指針,實現斷點續傳
result = uploadFile(remoteFileName, f, ftpClient, remoteSize);
//如果斷點續傳沒有成功,則刪除伺服器上文件,重新上傳
if(result == UploadStatus.Upload_From_Break_Failed){
if(!ftpClient.deleteFile(remoteFileName)){
return UploadStatus.Delete_Remote_Faild;
}
result = uploadFile(remoteFileName, f, ftpClient, 0);
}
『叄』 java jdk1.6環境下實現 ftp文件上傳
通過JDK自帶的API實現
package com.cloudpower.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
/**
* Java自帶的API對FTP的操作
* @Title:Ftp.java
* @author: 周玲斌
*/
public class Ftp {
/**
* 本地文件名
*/
private String localfilename;
/**
* 遠程文件名
*/
private String remotefilename;
/**
* FTP客戶端
*/
private FtpClient ftpClient;
/**
* 伺服器連接
* @param ip 伺服器IP
* @param port 伺服器埠
* @param user 用戶名
* @param password 密碼
* @param path 伺服器路徑
* @author 周玲斌
* @date 2012-7-11
*/
public void connectServer(String ip, int port, String user,
String password, String path) {
try {
/* ******連接伺服器的兩種方法*******/
//第一種方法
// ftpClient = new FtpClient();
// ftpClient.openServer(ip, port);
//第二種方法
ftpClient = new FtpClient(ip);
ftpClient.login(user, password);
// 設置成2進制傳輸
ftpClient.binary();
System.out.println("login success!");
if (path.length() != 0){
//把遠程系統上的目錄切換到參數path所指定的目錄
ftpClient.cd(path);
}
ftpClient.binary();
} catch (IOException ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
/**
* 關閉連接
* @author 周玲斌
* @date 2012-7-11
*/
public void closeConnect() {
try {
ftpClient.closeServer();
System.out.println("disconnect success");
} catch (IOException ex) {
System.out.println("not disconnect");
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
/**
* 上傳文件
* @param localFile 本地文件
* @param remoteFile 遠程文件
* @author 周玲斌
* @date 2012-7-11
*/
public void upload(String localFile, String remoteFile) {
this.localfilename = localFile;
this.remotefilename = remoteFile;
TelnetOutputStream os = null;
FileInputStream is = null;
try {
//將遠程文件加入輸出流中
os = ftpClient.put(this.remotefilename);
//獲取本地文件的輸入流
File file_in = new File(this.localfilename);
is = new FileInputStream(file_in);
//創建一個緩沖區
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
System.out.println("upload success");
} catch (IOException ex) {
System.out.println("not upload");
ex.printStackTrace();
throw new RuntimeException(ex);
} finally{
try {
if(is != null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(os != null){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 下載文件
* @param remoteFile 遠程文件路徑(伺服器端)
* @param localFile 本地文件路徑(客戶端)
* @author 周玲斌
* @date 2012-7-11
*/
public void download(String remoteFile, String localFile) {
TelnetInputStream is = null;
FileOutputStream os = null;
try {
//獲取遠程機器上的文件filename,藉助TelnetInputStream把該文件傳送到本地。
is = ftpClient.get(remoteFile);
File file_in = new File(localFile);
os = new FileOutputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
System.out.println("download success");
} catch (IOException ex) {
System.out.println("not download");
ex.printStackTrace();
throw new RuntimeException(ex);
} finally{
try {
if(is != null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(os != null){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String agrs[]) {
String filepath[] = { "/temp/aa.txt", "/temp/regist.log"};
String localfilepath[] = { "C:\\tmp\\1.txt","C:\\tmp\\2.log"};
Ftp fu = new Ftp();
/*
* 使用默認的埠號、用戶名、密碼以及根目錄連接FTP伺服器
*/
fu.connectServer("127.0.0.1", 22, "anonymous", "IEUser@", "/temp");
//下載
for (int i = 0; i < filepath.length; i++) {
fu.download(filepath[i], localfilepath[i]);
}
String localfile = "E:\\號碼.txt";
String remotefile = "/temp/哈哈.txt";
//上傳
fu.upload(localfile, remotefile);
fu.closeConnect();
}
}
『肆』 Java ftp 斷點續傳報錯
NoClassDefFoundError
1.未通過編譯
2.沒有引入jar包
『伍』 java ftp上傳到linux伺服器,程序上百個文件上傳,中間出現中斷,改怎麼解決啊
tar ,把文件打包一起上傳
『陸』 FTP上傳時經常中斷,怎麼辦
原因:ftp上傳經常中斷
分析:本地網路+查看伺服器運行狀態+服務端網路+伺服器端FTP服務+檢查FTP服務端設置+上傳的數據文件數量+日誌
解決辦法:
1、檢查本地網路是否有抖動或者斷網從而導致本地FTP客戶端軟體連接到伺服器之間有問題。
2、查看需要伺服器狀態是否正常,是否宕機或者有其他問題導致的中斷。
3、查看伺服器端網路是否有抖動或者斷網從而導致FTP服務端與FTP客戶端無法正常連接。
4、檢查伺服器端FTP服務是否正常運行。
5、查看FTP服務端配置中的連接時間設置。
6、如果上傳文件數量比較大,建議您將文件打成壓縮包的方式以二進制上傳。
7、分析FTP服務日至,查到問題根源。
(6)java使用ftp中斷文件上傳擴展閱讀:
開發任何基於 FTP 的客戶端軟體都必須遵循 FTP 的工作原理,FTP 的獨特的優勢同時也是與其它客戶伺服器程序最大的不同點就在於它在兩台通信的主機之間使用了兩條 TCP 連接,一條是數據連接,用於數據傳送;
另一條是控制連接,用於傳送控制信息(命令和響應),這種將命令和數據分開傳送的思想大大提高了 FTP 的效率,而其它客戶伺服器應用程序一般只有一條 TCP 連接。圖 1 給出了 FTP 的基本模型。
客戶有三個構件:用戶介面、客戶控制進程和客戶數據傳送進程。伺服器有兩個構件:伺服器控制進程和伺服器數據傳送進程。在整個交互的 FTP 會話中,控制連接始終是處於連接狀態的,數據連接則在每一次文件傳送時先打開後關閉。
『柒』 java實現ftp斷點續傳問題
//嘗試移動文件內讀取指針,實現斷點續傳
result
=
uploadFile(remoteFileName,
f,
ftpClient,
remoteSize);
//如果斷點續傳沒有成功,則刪除伺服器上文件,重新上傳
if(result
==
UploadStatus.Upload_From_Break_Failed){
if(!ftpClient.deleteFile(remoteFileName)){
return
UploadStatus.Delete_Remote_Faild;
}
result
=
uploadFile(remoteFileName,
f,
ftpClient,
0);
}
『捌』 java ftp 上傳文件失敗
首先確認ftp伺服器是否支持Passive模式,其次看看是否防火牆或網路鏈路問題
建議抓包看看
『玖』 ftp上傳文件時中斷或超時怎麼解決
實驗分析:
第一次,上傳了39.9M共計4330個文件,用了半小時,中間出現多次傳輸失敗。
第二次,上傳了12.9M的一個壓縮包文件,用了6秒,中間未出現傳輸失敗。
第三次,上傳了117M的一個壓縮包文件,用了17秒,中間未出現傳輸失敗。
細心的人不難看出,出現上傳中斷的實驗中,所上傳的數據有個明顯的特點:文件數特別多。而上傳成功的兩次,則只有一個文件上傳。
這樣看來,FTP上傳中斷應該是跟待上傳的文件個數有關了。
專業解釋如下:
FTP是應用層的協議,它基於傳輸層,為用戶服務,它們負責進行文件的傳輸。FTP是一個8位的客戶端-伺服器協議,能操作任何類型的文件而不需要進一步處理,就像MIME或Unicode一樣。但是,FTP有著極高的延時,這意味著,從開始請求到第一次接收需求數據之間的時間會非常長,並且不時的必需執行一些冗長的登錄進程。
FTP服務一般運行在20和21兩個埠。埠20用於在客戶端和伺服器之間傳輸數據流,而埠21用於傳輸控制流,並且是命令通向ftp伺服器的進口。當數據通過數據流傳輸時,控制流處於空閑狀態。而當控制流空閑很長時間後,客戶端的防火牆會將其會話置為超時,這樣當大量數據通過防火牆時,會產生一些問題。此時,雖然文件可以成功的傳輸,但因為控制會話會被防火牆斷開,傳輸會產生一些錯誤。
說的這么專業,很多非計算機專業的童鞋可能看能雲里霧里,那麼我們通俗的解釋下為什麼會出現FTP上傳的文件數比較多的時候就會很慢而且經常中斷。
我們把伺服器比作一座城市,我們上傳的文件就是想要去到城市裡的人,FTP協議是想要進城必須遵守的規矩,而傳輸數據的埠就是城門,每一個文件看做一個人。
當我們使用FTP客戶端向伺服器上傳文件數表較多的數據的時候,可以看做是一群人分別駕駛著自己的小轎車通過埠這座門戶進入伺服器這座城市。
但是,因為進城就必須遵守一定的規則(FTP協議),也就是必須先去命令埠這道門申報一下我要進城然後從數據埠這道門進去,且每次開門只能進一輛車,例如上圖的5輛車進城就必須排隊等著城門(數據埠)開啟關閉5次,而每一次開啟關閉城門用時特別久,最重要的是在命令埠這道門申報了之後並不是一直有效,而是在一定時間之後就會關閉,數據埠一看命令埠關閉了,就會跟著關閉,而這時候因為開門關門佔用了大量的時間,等待進城的這些車並沒有全部進去,這時候就需要重新去命令埠申報,這就是為什麼上傳著數據中突然中斷了,因為命令埠的開放時間到了,必須重新申報了。
那麼將大量數據壓縮成一個壓縮包上傳呢,這時候就可以看做是一群人坐著一輛大巴車進城。
這時候,因為只有一輛車進城,所以在命令埠開放的時間內,這輛大巴車就已經進去城市了,也就不會出現中斷了。
分析到了這里,我們應該很明白了,如果想解決FTP上傳中斷的問題,那麼最好的解決辦法就是將數據打包壓縮之後再上傳,這樣就不會出現上傳中斷了,切記,千萬不要一次上傳太多的文件,一定要打包壓縮上傳。
『拾』 如何用java代碼實現ftp文件上傳
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class test {
private FTPClient ftp;
/**
*
* @param path 上傳到ftp伺服器哪個路徑下
* @param addr 地址
* @param port 埠號
* @param username 用戶名
* @param password 密碼
* @return
* @throws Exception
*/
private boolean connect(String path,String addr,int port,String username,String password) throws Exception {
boolean result = false;
ftp = new FTPClient();
int reply;
ftp.connect(addr,port);
ftp.login(username,password);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(path);
result = true;
return result;
}
/**
*
* @param file 上傳的文件或文件夾
* @throws Exception
*/
private void upload(File file) throws Exception{
if(file.isDirectory()){
ftp.makeDirectory(file.getName());
ftp.changeWorkingDirectory(file.getName());
String[] files = file.list();
for (int i = 0; i < files.length; i++) {
File file1 = new File(file.getPath()+"\\"+files[i] );
if(file1.isDirectory()){
upload(file1);
ftp.changeToParentDirectory();
}else{
File file2 = new File(file.getPath()+"\\"+files[i]);