PHP: cURL을 이용해 다른 서버로 파일 전송하기


파일을 다른 서버로 전송할 때 반드시 FTP나 fopen 함수만을 사용해야 하는 것은 아닙니다. cURL(Client URL) 함수를 활용하면 FTP의 기능을 충분히 대체할 수 있으며, 특히 파일을 일반 변수 형태로 안전하게 전송할 수 있어 매우 유용합니다.

📌 목차

  • 1. cURL을 이용한 파일 전송 개요
  • 2. PHP 소스코드 구현 예제
  • 3. 핵심 구현 포인트 정리

1. cURL을 이용한 파일 전송 개요

로컬 환경에서 파일을 받아 http://example.com/test.php 주소로 파일을 전송하는 상황을 가정해 보겠습니다. 일반적인 파일 업로드와 다르게, 서버 측에서 $_FILES 슈퍼 글로벌 변수가 아닌 $_POST의 imagefile 변수로 데이터를 받도록 처리한다는 점에 주목해야 합니다.

cURL 옵션을 통해 파일 데이터를 Base64 방식으로 인코딩하여 전송하므로 방화벽이나 네트워크 환경에 구애받지 않고 안정적인 데이터 통신이 가능합니다.

2. PHP 소스코드 구현 예제

아래의 소스코드는 파일을 읽어 들여 Base64로 인코딩한 후 cURL을 통해 원격 서버로 전송하고 처리하는 전체 예제입니다.

<?php 
/* 
test.php 의 내용 
print_r($_POST); 

// 내용을 임시 파일로 만들어서 uploaded 폴더에 저장합니다. 
$str = base64_decode($_POST['imagefile']); 
$tmpfname = tempnam("/tmp", "test_");  
$handle = fopen($tmpfname, "wb");  
fwrite($handle, $str);  
fclose($handle);  

move_uploaded_file($tmpfname, "uploaded/test.gif"); 
*/ 

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

  // $data is file data 
  $post   = array('imagefile' => $data); 
  $timeout = 30; 
  $curl    = curl_init(); 

  curl_setopt($curl, CURLOPT_URL, 'http://example.com/test.php'); 
  curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); 
  curl_setopt($curl, CURLOPT_POST, 1); 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt($curl, CURLOPT_POSTFIELDS, $post); 

  $str = curl_exec($curl); 

  curl_close ($curl); 
  print_r($str); 
  /* 
  결과: 
  Array ( 
    [imagefile] => /9j/4AAQSkZJRgABAgEAYABgAAD/7gAOQWRv.... 
  )  
  */ 
} 
?> 

<form enctype="multipart/form-data" action="" method="POST">  
    이 파일을 전송합니다: <input name="userfile" type="file" />  
    <input type="submit" value="파일 전송" />  
</form>

3. 핵심 구현 포인트 정리

cURL을 활용한 파일 전송 시 기억해야 할 핵심 내용은 다음과 같습니다.

  • Base64 인코딩 및 디코딩: 파일 바이너리 데이터를 직접 전송하는 대신 base64_encode 함수를 통해 문자열 형태로 변환하여 전송하고, 수신 측에서 base64_decode로 복원합니다.
  • POST 방식 활용: CURLOPT_POSTFIELDS 옵션을 사용하여 배열 형태의 데이터를 원격 서버로 안전하게 전달합니다.
  • 타임아웃 설정: 대용량 파일 전송 시 네트워크 지연에 대비하여 CURLOPT_TIMEOUT 옵션을 적절하게 설정하는 것이 좋습니다.