프로그래밍을 하다보면 다른서버로 이미지파일이나 기타 파일을 보내야 하는 경우가 있습니다.
그럴 경우 여러 방법이 있는데 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));
끝
'프로그래밍 > php' 카테고리의 다른 글
PHP의 date() 함수: 포맷 문자열 총정리 (0) | 2024.07.04 |
---|---|
PHP 애플리케이션의 보안 취약성 (CVE-2024-2961) 대응 방법 (0) | 2024.07.02 |
이미지 파일을 base64로 변환하여 HTML에 삽입하는 방법: 성능 향상을 위한 팁 (0) | 2023.04.22 |
앞자리 01 02 03 에서 0를 제거 하고 싶을 때 intval사용 (0) | 2021.08.23 |
PHP 에러표시 방법 (0) | 2021.06.30 |