2017-12-04 1 views
2

안녕하세요, ftp 프로토콜을 사용하여 파일을 서버로 직접 보내려는 스크립트를 만들고 있습니다. 이렇게하려면 PHP ftp 함수를 사용합니다.PHP에서 ftp_nb_put을 사용하여 파일을 FTP 서버로 업로드하면 대상 파일이 비어 있습니다.

$conn_id = ftp_connect('XXXX.com', 21); 

$login_result = ftp_login($conn_id, 'USER_XXXX', 'PWD_XXXX'); 
ftp_pasv($conn_id, true) or die("Cannot switch to passive mode"); 

if ((!$conn_id) || (!$login_result)) { 
    die("Problem FTP connection !"); 
} 

if (ftp_chdir($conn_id, 'SERVER_PATH')) { 
    echo ftp_pwd($conn_id) . "\n"; 
} else { 
    echo "Problem to change path\n"; 
} 

ftp_nb_put($conn_id, $File, $localPath. $File, FTP_ASCII); 


ftp_close($conn_id); 

없음 오류 발표하지만, 내 서버에 도착 파일이 비어 있습니다.

정확한 것을 잊었습니다. 업로드 할 파일이 큰 xlsx 파일입니다.

+0

'는 error_reporting (E_ALL)을보고 오류를 켜십시오;' – Akintunde007

+0

을 내가 해냈어 0 오류가이 라인'ftp_nb_put ($의 conn_id, $ 파일을 무엇 –

+0

을 표시, $ localPath. $ File, FTP_ASCII);'return? – Akintunde007

답변

1

코드가 잘못되었습니다. 차단하지 않는 것처럼 ftp_nb_put을 사용합니다.

간단한 코드를 원하면 ftp_put을 사용해야합니다.

실제로 비 차단 코드가 필요한 경우 ftp_nb_continue보고가 FTP_FINISHED 인 경우에만 연결을 닫아야합니다. File uploaded with ftp_nb_put to FileZilla FTP server in PHP is corrupted을 참조하십시오.

그렇지 않으면 업로드가 거의 시작되지 않은 현재 코드가 연결을 종료합니다.

코멘트에 제안 된 "sleep"은 (테스트에서 언급했듯이) 실제 코드에서이를 안정적으로 사용할 수는 없습니다.


두 번째 문제는 텍스트/아스키 모드 (FTP_ASCII)에 진 .xlsx 파일을 업로드하는 것입니다. 바이너리 모드 (FTP_BINARY)를 사용해야합니다. text/ascii 모드는 바이너리 파일을 손상시킵니다. 따라서 심지어 업로드가 완료되면 파일이 손상됩니다.


이 작동합니다 :

ftp_put($conn_id, $File, $localPath.$File, FTP_BINARY); 
관련 문제