uploader.php 는 File-Transfer 사용에 도움되기 위한 기본 설명서입니다.
(원격 파일 업로드에 대한 사용 설명서를 보시려면 curl.php 를 클릭하십시오.)

    주요 특징

  • (원격) 파일 업로드, 다운로드 기능.
  • SSL, cookie, proxy 접속 가능.
  • 인증을 통한 파일 업로드 가능.
  • http, https 접속을 통한 파일 전송 기능.
  • (원격) 파일 삭제 기능.
 

File-Transfer 에서 필요한 library 는 다음과 같습니다.

  1. uploader.php
    로컬에 파일을 업로드, 다운로드, 파일 삭제 등의 작업을 합니다.
  2. curl.php
    원격으로 파일을 업로드하거나 다운로드 합니다.
  3. download.php
    로컬 파일을 다운로드 합니다.
  4. mime_types.php
    파일 Mime-Type 을 출력합니다.
  5. globals_filter.php
    _SERVER 전역 변수를 필터링합니다.

환경 설정

공통 상수

  • HABONYPHP_DIRNAME
    						
    File-Transfer 가 설치된 경로. 끝에 반드시 / 를 입력해 주세요.
    
    기본값: ./

사용 가능한 상수

  • PHP_FILE_TRANSFER_NAME_HASH
    						
    파일 암호화 방식.
    
    기본 값: sha512
  • PHP_FILE_TRANSFER_BOUNDARY
    						
    BOUNDARY 설정.
    
    기본 값: md5(time() . uniqid())

사용 가능한 목록.

File-Transfer 클래스에서 사용할 수 있는 메소드 목록을 설명합니다.

  • set_upload( settings )

    File-Transfer 를 시작하기 전에 설정을 구성합니다.

    • settings: 배열,
      • upload_dir: 업로드 파일 폴더. 기본 값: ./data
      • extended_dir: 업로드 파일 폴더 확장. 기본 값: null
      • ctype: 허용할 파일 확장자. 문자열(또는 배열)을 공백으로 지정. 값을 비우면 모두 허용합니다. 기본 값: null
        												
        ex.1)
        'ctype' => 'gif bmp jpg png'
        
        ex.2)
        'ctype' => array(
        	'imagefile' => 'gif bmp jpg png',
        	'mediafile' => 'avi mpg mov'
        );
      • make_dir: 업로드 폴더를 자동으로 만들지를 설정합니다. true 이면 자동으로 만듭니다. 기본 값: false
        단, 폴더를 만들 상위 폴더에 쓰기 권한이 있어야 가능합니다.
      • real_file: remote 에 저장될 파일 이름을 설정합니다. 기본 값: hash('sha512', 'microtime')
        • func: 함수 명. time, mktime, date (또는 사용자) 함수 등
        • code: 함수 값.
        • bool: true or false. true 이면 파일 확장자가 붙습니다.
        												
        'real_file' => array(
        	'func' => 'date',
        	'code' => 'Y-m-d',
        	'bool' => true
        );
        // 결과 => 2015-01-01.gif
      • auth: 사용자 아이디, 비밀번호 설정. 사용자 토큰(또는 사용자 접근 권한)으로 사용 가능합니다. 기본 값: null
        • user: 사용자 아이디
        • pass: 사용자 비밀번호
        												
        'auth' => array(
        	'user' => 'habony',
        	'pass' => '1234'
        );
  • set_upload_dir( upload_dir, extended_dir )

    파일을 저장할 폴더 경로를 설정합니다.

    • upload_dir: 업로드 파일 폴더. 기본 값: ./data
    • extended_dir: 업로드 파일 폴더 확장. 기본 값: null

    							
    require_once('../../library/uploader.php');
    	
    ex.1)
    $f = new file_transfer();
    $f->set_upload_dir( './username' );
    
    ex.2)
    $f = new file_transfer();
    $f->set_upload_dir( './username', date("Ymd") );
  • set_upload_remote( func, code, bool )

    remote 에 저장될 파일 이름을 설정합니다.

    • func: 함수 명. time, mktime, date (또는 사용자) 함수 등
    • code: 함수 값.
    • bool: true or false. true 이면 파일 확장자가 붙습니다.

    							
    $func => 'date';
    $code => 'Y-m-d';
    $bool => true;
    
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    $f->set_upload_remote( $func, $code, $bool );
    // 결과 => 2015-01-01.gif
  • set_upload_auth( user, pass )

    사용자 아이디, 비밀번호를 설정합니다. 사용자 토큰(또는 사용자 접근 권한)으로 사용 가능합니다.

    • user: 사용자 아이디
    • pass: 사용자 비밀번호

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    
    // 파일을 업로드 하기 전에 인증을 설정합니다.
    $user = 'habony';
    $pass = '123456';
    $f->set_upload_auth($user, $pass);
    
    
    // 설정된 사용자 아이디와 비밀번호가 세션 값과 일치하는지 검증합니다.
    $upload_user_auth = array(
    	'user' => $_SESSION['user'],
    	'pass' => $_SESSION['pass']
    );
    $f->upload_transfer(null, $upload_user_auth);
  • upload_transfer( upload_attach, upload_user_auth )

    파일을 사용자 폴더로 이동하기 전 임시 폴더로 이동합니다.

    • upload_attach: 파일의 배열 목록. 선택 사항
    • upload_user_auth: 설정된 인증을 검증할 아이디와 비밀번호. 선택 사항
      • user: 사용자 아이디
      • pass: 사용자 비밀번호

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    $f->upload_transfer( $_FILES );
  • upload_move_file()

    임시 폴더에서 사용자 폴더로 이동합니다.

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    $f->upload_transfer($_FILES);
    $f->upload_move_file();
  • file_download( real_name, filename, speed, sleep )

    로컬 파일을 다운로드 합니다. 브라우저 출력이 없어야 합니다.

    • real_name: 실제 파일 경로
    • filename: 파일 이름. 생략시 real_name 파일 이름으로 설정됩니다.
    • speed: 다운로드 전송 속도. 기본 값: 10
    • sleep: 다운로드 지연 시간. 1 이하로 설정하면 지연 시간이 무시됩니다. 기본 값: 1

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    
    // 저장되어 있는 업로드 경로를 설정합니다.
    $f->set_upload(
    	array('upload_dir' => './data')
    );
    $f->file_download( '2015-04-05-12345', 'habony.gif', 100, 0 );
  • file_browser( list, boundary )

    파일을 브라우저로 출력 합니다. 원격 파일 저장할 때 필요합니다.
    파일을 base64_encode 로 읽어 브라우저로 출력하면 원격에서 curl_get_browser 를 이용해 파일로 변환합니다.

    • list: 파일 배열 목록. ex.) #real_name;filename
    • boundary: 사용자 정의 boundary 를 설정합니다.

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    
    // 저장되어 있는 업로드 경로를 설정합니다.
    $f->set_upload(
    	array('upload_dir' => './data')
    );
    
    $f->file_browser(
    	array(
    		'#123456789.gif;habony.gif',
    		'#asdfghjk.png;habonyphp.png'
    	)
    );
  • upload_delete_file( value )

    파일을 삭제합니다. 문자열(또는 파일 배열), *,? 의 문자 등으로 다수의 파일을 삭제할 수 있습니다.

    • value: 문자열(또는 파일 배열), glob pattern 과 일치하는 파일 이름을 찾아 삭제합니다.

    							
    require_once('../../library/uploader.php');
    
    ex.1)
    $f = new file_transfer();
    
    // 다수의 파일을 삭제합니다.
    $f->upload_delete_file(
    	array( 'habony.gif', '2015-04-05.png', 'zudy.zip' )
    );
    
    ex.2)
    $f = new file_transfer();
    
    // 2015 로 시작하는 파일을 모두 삭제합니다.
    $f->upload_delete_file(
    	'2015*'
    );
  • upload_file_size( filesize )

    파일 크기를 문자열로 반환합니다.

    • filesize: 정수

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    $f->upload_file_size( 1024 );
    // 결과: 1 KB
  • hash_filename

    파일 이름을 암호화합니다. 기본 값: sha512

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    $f->hash_filename( 'filename' );
    // 결과: 32de73bec5e2a522b0bb22dda723f31aabee6ed3cb3bab9646f7b598662732d5f9579441bf04607187b99eb054f33db78220176b0fc0cb7a7ee3ce70917f28ff
  • upload_success_list()

    업로드 성공한 파일 목록을 출력합니다.

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    $f->upload_transfer();
    $f->upload_move_file();
    
    print_r($f->upload_success_list());
  • upload_err_list()

    파일 업로드 중 에러가 발생한 목록을 출력합니다.

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    $f->upload_transfer();
    $f->upload_move_file();
    
    print_r($f->upload_err_list());
  • upload_json_encode( json )

    업로드 성공한 JSON encode 파일 목록을 출력합니다.
    원격 업로드시 사용됩니다.

    • json: 파일 배열 목록. 선택 사항입니다.

    							
    require_once('../../library/uploader.php');
    
    ex.1)
    $f = new file_transfer();
    $f->upload_transfer();
    $f->upload_move_file();
    
    print_r($f->upload_json_encode());
    
    ex.2)
    $json = array(
    	array(
    		'name' => image1.gif,
    		'real_name' => hash('sha512', microtime()),
    		'size' => 1 KB,
    		'tmp_name' => /tmp/php69C3.tmp,
    		'mime_type' => image/gif
    		'ctype' => gif
    	),
    	array(
    		'name' => image2.gif,
    		'real_name' => hash('sha512', microtime()),
    		'size' => 2 KB,
    		'tmp_name' => /tmp/php69Z5.tmp,
    		'mime_type' => image/bmp
    		'ctype' => bmp
    	),
    	....
    )
    
    $f = new file_transfer();
    print_r(
    	$f->upload_json_encode( $json )
    );
  • upload_json_decode( json )

    JSON encode 된 파일 목록을 디코드합니다.
    원격 업로드시 사용됩니다.

    • json: 파일 배열 목록. 선택 사항입니다.

    							
    require_once('../../library/uploader.php');
    
    $f = new file_transfer();
    
    print_r(
    	$f->upload_json_encode( $f->upload_json_encode() )
    );

반환되는 에러 목록

파일 업로드 중 에러가 발생하면 upload_err_list() 에 저장될 에러 목록을 설명합니다.

  • 파일 이름에 허용하지 않은 문자를 포함할 때 출력되는 에러입니다.
    					
    array(
    	'code' => 100,
    	'name' => '파일 이름',
    	'message' => "Contains characters that are not allowed in the file name."
    );
  • 업로드한 파일은 ini_get('upload_max_filesize') 를 초과했을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 101,
    	'name' => '파일 이름',
    	'message' => "Upload a file does not exceed " . ini_get('upload_max_filesize')
    );
  • 업로드한 파일이 HTML 폼에서 지정한 MAX_FILE_SIZE 폼 필드 보다 크면 출력되는 에러입니다.
    					
    array(
    	'code' => 102,
    	'name' => '파일 이름',
    	'message' => "The uploaded file is larger than '" . $this->upload_file_size($_POST['MAX_FILE_SIZE']) . "' specified in the HTML form."
    );
  • 파일이 일부분만 전송되었을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 103,
    	'name' => '파일 이름',
    	'message' => "The only part of the file has been sent."
    );
  • 파일이 전송되지 않았을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 104,
    	'name' => '파일 이름',
    	'message' => "This file has not been sent."
    );
  • 파일을 찾을 수 없을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 105,
    	'name' => '파일 이름',
    	'message' => 'File Not Found.'
    );
  • 임시 폴더가 없을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 106,
    	'name' => '파일 이름',
    	'message' => "Temporary folder does not exist."
    );
  • 디스크에 파일 쓰기를 실패했을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 107,
    	'name' => '파일 이름',
    	'message' => "Failed to write the file to disk."
    );
  • 확장에 의해 파일 업로드가 중지되었을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 108,
    	'name' => '파일 이름',
    	'message' => "The uploaded file was stopped by the expansion."
    );
  • 허용하지 않는 파일일 때 출력되는 에러입니다.
    					
    array(
    	'code' => 109,
    	'name' => '파일 이름',
    	'message' => "The file is not allowed."
    );
  • 업로드 디렉토리를 만들 수 없을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 200,
    	'name' => '파일 이름',
    	'message' => "Failed to create the upload directory."
    );
  • 업로드된 파일의 사용 권한을 변경하지 못했을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 201,
    	'name' => '파일 이름',
    	'message' => "Failed to change the permissions of the uploaded file."
    );
  • 지정된 디렉토리에 업로드된 파일을 이동하지 못했을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 202,
    	'name' => '파일 이름',
    	'message' => "Failed to move uploaded file to a specified directory."
    );
  • 업로드 할 수 있는 권한이 없을 때 출력되는 에러입니다.
    					
    array(
    	'code' => 301,
    	'name' => '파일 이름',
    	'message' => "You do not have permission to upload."
    );

인증을 통한 파일 업로드

형식: set_upload_auth( user, pass );

Example #1

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 파일을 업로드 하기 전에 인증을 설정합니다.
$user = 'habony';
$pass = '123456';
$f->set_upload_auth($user, $pass);


// 설정된 사용자 아이디와 비밀번호가 _POST 값과 일치하는지 검증합니다.
$upload_user_auth = array(
	'user' => $_POST['user'],
	'pass' => $_POST['pass']
);
$f->upload_transfer( null, $upload_user_auth );
$f->upload_move_file();

Example #2

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 파일을 업로드 하기 전에 인증을 설정합니다.
$user = 'habony';
$pass = '123456';
$f->set_upload_auth($user, $pass);

// 설정된 사용자 아이디와 비밀번호가 _SESSION 값과 일치하는지 검증합니다.
$upload_user_auth = array(
	'user' => $_SESSION['user'],
	'pass' => $_SESSION['pass']
);
$f->upload_transfer( null, $upload_user_auth );

Example #3

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 파일을 업로드 하기 전에 인증을 설정합니다.
$user = 'token';
$pass = '1234567890a';
$f->set_upload_auth($user, $pass);


// 설정된 사용자 토큰의 키와 세션 값이 일치하는지 검증합니다.
$upload_user_auth = array(
	'user' => 'token',
	'pass' => $_SESSION['key']
);
$f->upload_transfer(null, $upload_user_auth);
$f->upload_move_file();

파일 이름 사용자 정의

형식: set_upload_remote( func, code, bool );

Example #1

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 파일을 업로드 하기 전에 remote 파일 이름을 설정합니다.
// ex.) 2015-01-01.gif
$func => 'date';
$code => 'Y-m-d';
$bool => true;
$f->set_upload_remote( $func, $code, $bool );

$f->upload_transfer();
$f->upload_move_file();

Example #2

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 파일을 업로드 하기 전에 remote 파일 이름을 설정합니다.
// ex.) 0bc8096ab2e0185a632aee6ddc58b8c0.gif
$func => 'md5';
$code = 'habony';
$bool => true;
$f->set_upload_remote( $func, $code, $bool );

$f->upload_transfer();
$f->upload_move_file();

Example #3

확장자 없는 파일이름을 설정합니다.

							
function uhash($value){
	list($usec, $sec) = explode(" ", microtime());
	return md5(($usec + $sec) * $value);
}

require_once('../../library/uploader.php');

$f = new file_transfer();

// 파일을 업로드 하기 전에 remote 파일 이름을 설정합니다.
// ex.) a634cf79a31807f2184c2f20e1a97398
$func => 'uhash';
$code = '123456';
$f->set_upload_remote( $func, $code );

$f->upload_transfer();
$f->upload_move_file();

Example #4

확장자만 붙여 파일이름을 설정합니다.

							
require_once('../../library/uploader.php');

$f = new file_transfer();

// 파일을 업로드 하기 전에 remote 파일 이름을 설정합니다.
// ex.) 9d3046d5b4502c20c5545beac03835d43b00f1810a56bb04449f85dd14d730d0c82888dedc34dd1eea3150e9e3d02e84b3de3a7691934123fa3ded191b8c136c.gif
$bool = true;
$f->set_upload_remote( null, null, $bool );

$f->upload_transfer();
$f->upload_move_file();


파일 확장자 제한 업로드

형식: set_upload( ctype );

Example #1

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 이미지 파일만 허용하도록 설정합니다.
$f->set_upload(
	array(
		'ctype' => 'gif bmp jpg png'
	)
);

$f->upload_transfer();
$f->upload_move_file();

Example #2

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// imagefile 필드는 이미지 파일만 허용하도록 설정하고,
// mediafile 필드는 동영상 파일만 허용하도록 설정합니다.
$f->set_upload(
	array(
		'ctype' => array(
			'imagefile' => 'gif bmp jpg png',
			'mediafile' => 'avi mpg mov'
		)
	)
);

$f->upload_transfer();
$f->upload_move_file();

업로드 폴더 자동 생성

형식: set_upload_dir( upload_dir, extended_dir );

Example #1

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 업로드 폴더 자동 생성되도록 설정합니다.
$f->set_upload(
	array('make_dir' => true)
);

$extended_dir = '/userName';
$f->set_upload_dir( './data', $extended_dir);
// 결과: ./data/userName

$f->upload_transfer();
$f->upload_move_file();

Example #2

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 업로드 폴더 자동 생성되도록 설정합니다.
$f->set_upload(
	array(
		'make_dir' => true,
		'upload_dir' => './data',
		'extended_dir' => '/' . data("Ymd")
	)
);
// 결과: ./data/20150405

$f->upload_transfer();
$f->upload_move_file();

파일 다운로드

형식: file_download( real_name, filename, speed, sleep );

Example #1

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 업로드 폴더 설정
$f->set_upload(
	array(
		'upload_dir' => './data'
	)
);

$f->file_download('2015-04-011558100.png', 'image.jpg');
$e = $f->upload_err_list();
if(!empty($e))
{
	echo "다운로드 중 에러가 발생하였습니다.";
}

Example #2

인증을 통해 파일을 다운로드하는 방법입니다.

						
require_once('../../library/uploader.php');

$f = new file_transfer();

// 저장되어 있는 경로를 설정합니다.
$f->set_upload(
	array(
		'upload_dir' => './data',
		'auth' => array(
			'user' => 'habony',
			'pass' => '123456'
		)
	)
);

$upload_user_auth = array(
	'user' => $_POST['u_id'],
	'pass' => $_POST['u_pass']
);
$f->upload_transfer( null, $upload_user_auth );
$e = $f->upload_err_list();

if(!empty($e))
{
	print_r($e);
}
else
{
	$f->file_download('2015-04-011558100.png', 'image.jpg');
}

원격 파일 브라우저 전송

형식: file_browser( list, boundary );

Example #1

						
define("HABONYPHP_DIRNAME", "../../");
require_once(HABONYPHP_DIRNAME . 'library/uploader.php');
require_once(HABONYPHP_DIRNAME . 'library/curl.php');

$c = new curl();

// 다운로드 받은 파일을 저장할 폴더를 지정합니다.
$c->set_curl(
	array('upload_dir'=>'./data')
);

$c->curl_get_browser(
	'http://example.com/download',
	array(
		// 다운로드 받을 파일은 '#real_file;filename' 형식.
		'#2015-08-09.tmp;habony.zip',
		'#2015-08-10.tmp;example.php',

		// 폼 요소 구성
		'name' => 'habony',
		'age' => 15
	)
);

/*
	# target server : http://example.com/download


	require_once('../../library/uploader.php');
	
	$f = new file_transfer();

	// 저장되어 있는 경로를 설정합니다.
	$f->set_upload(
		array('upload_dir' => './data')
	);

	$f->file_browser( $_POST );
*/

Example #2

인증을 통해 파일을 전송합니다.

							
define("HABONYPHP_DIRNAME", "../../");
require_once(HABONYPHP_DIRNAME . 'library/uploader.php');
require_once(HABONYPHP_DIRNAME . 'library/curl.php');

$c = new curl();

// 다운로드 받은 파일을 저장할 폴더를 지정합니다.
$c->set_curl(
	array('upload_dir'=>'./data')
);

$c->curl_get_browser(
	'http://example.com/download',
	array(
		// 다운로드 받을 파일은 '#real_file;filename' 형식.
		'#2015-08-09.tmp;habony.zip',
		'#2015-08-10.tmp;example.php',

		// 폼 요소 구성
		'u_id' => 'habony',
		'u_pass' => '123456789a'
	)
);

/*
	# target server : http://example.com/download


	require_once('../../library/uploader.php');
	
	$f = new file_transfer();

	// 저장되어 있는 경로를 설정합니다.
	$f->set_upload(
		array(
			'upload_dir' => './data',
			'auth' => array(
				'user' => 'habony',
				'pass' => '123456'
			)
		)
	);

	$upload_user_auth = array(
		'user' => $_POST['u_id'],
		'pass' => $_POST['u_pass']
	);
	$f->upload_transfer( null, $upload_user_auth );
	$e = $f->upload_err_list();

	if(!empty($e))
	{
		print_r($e);
	}
	else
	{
		$f->file_browser( );
	}
*/


파일 삭제

형식: upload_delete_file( value );

Example #1

						
require_once('../../library/uploader.php');

$f = new file_transfer();

$f->set_upload(
	array(
		'upload_dir' => './data'
	)
);

// 하나의 파일을 삭제합니다.
$f->upload_delete_file('habony.gif');

Example #2

여러 개의 파일을 삭제합니다.

							
require_once('../../library/uploader.php');

$f = new file_transfer();

$f->set_upload(
	array(
		'upload_dir' => './username'
	)
);

// 다수의 파일을 삭제합니다.
$f->upload_delete_file(
	array(
		'habony.gif',
		'2015-04-05.png',
		'zudy.zip'
	)
);

Example #3

glob 를 이용해 여러 개의 파일을 삭제합니다.

							
require_once('../../library/uploader.php');

$f = new file_transfer();

$f->set_upload(
	array(
		'upload_dir' => './data'
	)
);

// 2015 로 시작하거나 gif 로 끝나는 파일을 모두 삭제합니다.
$f->upload_delete_file(
	array(
		'2015*',
		'*.gif'
	)
);

Example #4

인증을 통해 파일을 삭제합니다.

							
require_once('../../library/uploader.php');

$f = new file_transfer();

$f->set_upload(
	array(
		'upload_dir' => './data',
		'auth' => array(
			'user' => 'habony',
			'pass' => '123456'
		)
	)
);

$upload_user_auth = array(
	'user' => $_POST['u_id'],
	'pass' => $_POST['u_pass']
);
$f->upload_transfer( null, $upload_user_auth );
$e = $f->upload_err_list();

if(!empty($e))
{
	print_r($e);
}
else
{
	$f->upload_delete_file( 'habony.gif' );
);