A. java ftp上傳時斷網,文件損壞
以二進制流上傳,然後實現斷點續傳。
/**
* 上傳文件到FTP伺服器,支持斷點續傳
* @param local 本地文件名稱,絕對路徑
* @param remote 遠程文件路徑,使用/home/directory1/subdirectory/file.ext 按照Linux上的路徑指定方式,支持多級目錄嵌套,支持遞歸創建不存在的目錄結構
* @return 上傳結果
* @throws IOException
*/
public UploadStatus upload(String local,String remote) throws IOException{
FTPClient ftpClient = new FTPClient();
//設置PassiveMode傳輸
ftpClient.enterLocalPassiveMode();
//設置以二進制流的方式傳輸
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
UploadStatus result;
//對遠程目錄的處理
String remoteFileName = remote;
if(remote.contains("/")){
remoteFileName = remote.substring(remote.lastIndexOf("/")+1);
String directory = remote.substring(0,remote.lastIndexOf("/")+1);
if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){
//如果遠程目錄不存在,則遞歸創建遠程伺服器目錄
int start=0;
int end = 0;
if(directory.startsWith("/")){
start = 1;
}else{
start = 0;
}
end = directory.indexOf("/",start);
while(true){
String subDirectory = remote.substring(start,end);
if(!ftpClient.changeWorkingDirectory(subDirectory)){
if(ftpClient.makeDirectory(subDirectory)){
ftpClient.changeWorkingDirectory(subDirectory);
}else {
System.out.println("創建目錄失敗");
return UploadStatus.Create_Directory_Fail;
}
}
start = end + 1;
end = directory.indexOf("/",start);
//檢查所有目錄是否創建完畢
if(end <= start){
break;
}
}
}
}
//檢查遠程是否存在文件
FTPFile[] files = ftpClient.listFiles(remoteFileName);
if(files.length == 1){
long remoteSize = files[0].getSize();
File f = new File(local);
long localSize = f.length();
if(remoteSize==localSize){
return UploadStatus.File_Exits;
}else if(remoteSize > localSize){
return UploadStatus.Remote_Bigger_Local;
}
//嘗試移動文件內讀取指針,實現斷點續傳
InputStream is = new FileInputStream(f);
if(is.skip(remoteSize)==remoteSize){
ftpClient.setRestartOffset(remoteSize);
if(ftpClient.storeFile(remote, is)){
return UploadStatus.Upload_From_Break_Success;
}
}
//如果斷點續傳沒有成功,則刪除伺服器上文件,重新上傳
if(!ftpClient.deleteFile(remoteFileName)){
return UploadStatus.Delete_Remote_Faild;
}
is = new FileInputStream(f);
if(ftpClient.storeFile(remote, is)){
result = UploadStatus.Upload_New_File_Success;
}else{
result = UploadStatus.Upload_New_File_Failed;
}
is.close();
}else {
InputStream is = new FileInputStream(local);
if(ftpClient.storeFile(remoteFileName, is)){
result = UploadStatus.Upload_New_File_Success;
}else{
result = UploadStatus.Upload_New_File_Failed;
}
is.close();
}
return result;
}
B. ftp文件為什麼那麼容易損壞30分
不是。如果你的文件是exe格式的。初步判定你存放文件的機子可能中毒了。
FTP文件的傳輸和復制文件沒什麼區別的。所以不太可能出現損壞
C. FTPMNU損壞或者結構改變是怎麼回事
可能是傳輸丟包現在造成的文件損壞。這是經常會出現的情況,建議日常及時維護修復系統即可避免。
D. 為什麼上傳到FTP上的文件下載時不完整或損壞
應該是上傳電腦的問題,畢竟FTP本機上傳下載都是正常的。首先檢查是不是病毒,然後檢查網路設置,比如防火牆、殺毒軟體什麼的,都先關閉了再試試。
E. linux 壓縮 上傳到ftp後下載回來文件損壞
解決方法:在終端下登錄ftp,首先輸入bin,會提示已轉換到BIN模式。然後進行你的put和get操作。該方法是將傳輸形式改為二進制傳輸(binary)。你的問題應該會得到解決。
延伸:因為在ftp傳輸過程中,默認是使用ASCII模式而非BIN模式,這樣會導致壓縮文件在傳輸過程中由於編碼或解碼錯誤而導致損壞。
望採納~
F. ftp 文件傳送失敗的原因
是不是你的東西太多了,刪幾個,或者是你打開了一個然後有上傳的,這樣是傳不上去的哦,需要把自己正在看的這個東西關掉,然後再上傳就OK了
G. c# 通過FTP上傳 的 zip 文件 發生損壞,我想知道有哪些原因會引起文件損壞,以及避免措施! 代碼如下!
readBytes = stream.Read(buffer, 0, bufferLength);//這里返回的是readBytes是你實際讀取的長度,readBytes應該是小於等於bufferLength的
requestStream.Write(buffer, 0, bufferLength);//所以這個地方應該改成
requestStream.Write(buffer, 0, readBytes);寫的長度應該是實際讀取的長度,而不應該是緩沖區的長度
補充,按我的辦法改成requestStream.Write(buffer, 0, readBytes);就可以了.不會帶空格的
H. 使用FTP傳輸文件後,偶爾有些文件會損壞,打不開,請問這是什麼情況怎麼避免
傳輸是通過網路協議分割傳輸的,可能是傳輸丟包現在造成的文件損壞,你可以通過檢測網線和交換機得傳輸速率查看網路,如果發現丟包,考慮更換傳輸速率更大的網線,