본문 바로가기
프로그래밍/php

PHP FTP 이미지전송 예제 ftp_connect, ssh2_connect 사용할 수 없을때

by 마루의 일상 2023. 4. 7.
728x90
반응형

프로그래밍을 하다보면 다른서버로 이미지파일이나 기타 파일을 보내야 하는 경우가 있습니다.

그럴 경우 여러 방법이 있는데 ftp_connect나 ssh2_connect는 서버에 모듈이 설치되어 있지 않으면 사용할 수 없습니다.

 

ftp 연결을 하기 위해서는 ftp_connect(), ftp_login()라는 명령어를 알아야 합니다.

 

ftp_connect(string $hostname, int $port = 21, int $timeout = 90): FTP\Connection|false

지정된 에 대한 FTP 연결을 엽니다

ftp_login(FTP\Connection $ftp, string $username, string $password): bool

지정된 FTP 연결에 로그인합니다.

ftp_put(FTP\Connection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY,  int $offset = 0): bool

FTP 서버에 로컬 파일을 저장합니다.

 

위에 정보를 이용한 기본 접속 예제

<?php
// 기본 접속 방법
                     
$ftp_server = "접속주소";
$ftp_user = "아이디";
$ftp_pass = "비밀번호";
$ftp_port = 21;
$ftp_file = "보낼 파일경로 파일명";
$ftp_sendfile = "파일명";

// 연결
$ftp = ftp_connect($ftp_server, $ftp_port) or die("Couldn't connect to $ftp_server"); 

// 로그인
if (@ftp_login($ftp, $ftp_user, $ftp_pass)) {
    echo "접속성공r\n";
} else {
    echo "접속실패\n";
}

// FTP 서버에 파일 전송
if (ftp_put($ftp, $ftp_remote_file, $ftp_sendfile, FTP_BINARY)) {
   echo "파일전송 성공";
} else {
    echo "파일전송 실패";
}

// 연결닫기
ftp_close($ftp);  
?>

 

sftp 를 이용한 이미지 업로드 방법

 

ssh2_connect(string $host,    int $port = 22,    array $methods = ?,    array $callbacks = ?): resource|false

원격 SSH 서버에 대한 연결을 설정합니다.

 

ssh2_auth_password(resource $session, string $username, string $password): bool

암호를 사용하여 SSH를 통해 인증합니다.

 

ssh2_sftp(resource $session): resource|false

 연결된 SSH2 서버에서 SFTP 하위 시스템을 요청합니다.

 

ssh2_scp_send(resource $session, string $local_file, string $remote_file, int $create_mode = 0644): bool

SCP 프로토콜을 사용하여 로컬 파일 시스템에서 원격 서버로 파일을 복사합니다.

<?php
$sftp_server = '서버주소';
$sftp_port = 22;
$sftp_user = '아이디';
$sftp_pass = '비밀번호';

$connection = ssh2_connect($sftp_server, $sftp_port); // 연결

ssh2_auth_password($connection, $sftp_user, $sftp_pass); // 로그인

$sftp = ssh2_sftp($connection);

ssh2_scp_send($connection, $file['tmp_name'], "/경로/파일이름", 0644);



?>

 

위에 방법은 모두 서버에 모듈이 있어야 하는 경우라 만약에 없을 경우 모듈을 설치 하시고 사용하시면 되고  서비스 중이라 서버 설정을 바꾸기가 어렵다면 아래 방법으로 사용하시면 됩니다.

 

보내는 소스

    $filename = $_FILES['file']['tmp_name'];
    $realfilename = $_FILES['file']['name'];
    
    if ($filename) {
        $handle = fopen($filename, "r");
        $data = base64_encode(fread($handle, filesize($filename)));

        $sendfilename = date("YmdHis")."_". $realfilename;
        
        $post = array('file' => $data, "filename" => $sendfilename);
        
        $curl = curl_init();

        curl_setopt($curl, CURLOPT_URL, '파일보낼주소/upload.php');
        curl_setopt($curl, CURLOPT_TIMEOUT, 30);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

        $str = curl_exec($curl);        
        curl_close ($curl);    
    }

받는 소스

$str = base64_decode($_POST['file']);
$tmpfname = tempnam("/tmp", "test_");

$handle = fopen($tmpfname, "wb");
fwrite($handle, $str);
fclose($handle);
$filecopy_check = false;
if (!copy($tmpfname, '파일복사할 경로(ex: /home/www/public_html/upload/file/)'.$filename))
{
	$filecopy_check = false;
} else {
	$filecopy_check = true;
}

echo json_encode(array("result" => $filecopy_check, "msg"=>($filecopy_check)?"success":"fail", "filename" => $filename));

728x90
반응형