iOS2012. 12. 18. 12:14

왼쪽 그림 하단의 버튼들은 상품카테고리를 나타낸다.  화면에 약 4개의 카테고리 밖에는 보여줄 수 없기 때문에 나머지 카테고리를 보여주기 위해 가로 스크롤뷰를 이용하여 좌우로 네비게시션이 가능하게 구성되어 있다.

아이폰 앱들 중 많은 것들이 상단이나 하단에 서브 메뉴의 형태로 가로 스크롤을 이용하는 것들이 많다. 예로 든 deal$의 경우에는 가로 스크롤에 추가로, 버튼을 클릭하였을 때 버튼의 크기를 키우는 효과를 추가로 사용하고 있다.

포스트에 첨부한 프로젝트 샘플은 간단히 가로 스크롤만을 구현한 것이다. 물론 개발은 비교적 쉽다. 기존의 스크롤뷰를   사용하면 된다.  

간단히 주석을 달아 놓았으니 HorizontalScrollMenuView와 HorizontalScrollMenuViewController 두 개의 클래스를 참고하면된다.













Posted by 다오나무
node.js2012. 10. 31. 10:41

It’s coming up to a year since we launch our server monitoring iPhone application and so our Apple push notification SSL certificate is expiring in a few weeks. It is necessary to renew it and install the new certificate on our servers so we can continue sending push notifications for server alerts, and this quick post will take you through the steps.

You can generate a new certificate without revoking the old one, and use them simultaneously to ensure they are working before revoking the old one.

1) Log in

iPhone Portal App IDs

Log into the Apple iPhone Developer website and click the iPhone Provisioning Portal link. From the left menu, click on App IDs and then Configure next to the app you want to regenerate the certificate for. You’ll see your existing certificates and the option to generate a new one. Click the Configure button to launch the wizard.

2) Generate a CSR

I used the CSR I generated for the original APNS certificate but you can generate a new one by following the instructions in the wizard.

3) Generate the certificate

iPhone Portal Generate

After uploading the CSR, the wizard will generate your new certificate. The name will show up as your username rather than what you specify in the CSR. Download it to your system, it will be called aps_production_identity.cer. Double click it to import it into your Keychain.

4. Export certificates / keys

Launch Keychain Assistant from your local Mac and from the login keychain, filter by the Certificates category. You will see an expandable option called “Apple Development Push Services”. You’ll see your old certificate and the new one you just downloaded.

Click the triangle to expand the certificate. You’ll have 2 items – the certificate itself that you just expanded, and the private key that was revealed.

Keychain Export

Right click on the certificate (not the private key) “Apple Development Push Services” > Export “Apple Development Push Services ID123″. Save this as apns-prod-cert.p12 file somewhere you can access it. Then do the same with the private key and save it as apns-prod-key.p12.

For both exports, you will be asked to specify a password, then asked for your keychain password. I did not specify a password on the first prompt.

5) Convert to PEM format

These files now need to be converted to the PEM format by executing these 2 commands from the terminal:

1
2
openssl pkcs12 -clcerts -nokeys -out apns-prod-cert.pem -in apns-prod-cert.p12
openssl pkcs12 -nocerts -out apns-prod-key.pem -in apns-prod-key.p12

You will be forced to set a PEM passphrase on the second command, so execute the following command to remove it:

1
openssl rsa -in apns-prod-key.pem -out apns-prod-key-noenc.pem

6) Merge files

Finally, you need to combine the key and cert files into a apns-prod.pem file we will use when connecting to APNS:

1
cat apns-prod-cert.pem apns-prod-key-noenc.pem > apns-prod.pem

And that’s it. You can replace your existing production certificate with the one you just created, and it’ll be valid for another year. Yay.


정리를 해보자.

응용프로그램 -> 키체인 접근  프로그램을 연다.

그리고 해당 푸쉬 인증서 삼각형 세모를 누르면 개인키가 보인다.

일단 인증서만 클릭해놓고 apns-prod-cert.p12 파일로 내보낸다.

그리고 개인키만 클릭해놓고 apns-prod-key.p12 파일로 내보낸다.


그리고 터미널을 실행해서 다음과 같은 명령을 실행한다.

openssl pkcs12 -clcerts -nokeys -out apns-prod-cert.pem -in apns-prod-cert.p12
openssl pkcs12 -nocerts -out apns-prod-key.pem -in apns-prod-key.p12

apns-prod-key.pem 을 만들때 암호를 지정할수밖에 없는데
이제 그 암호를 제거해서 보자. 다음 명령을 입력한다.

openssl rsa -in apns-prod-key.pem -out apns-prod-key-noenc.pem

이제
인증서 파일과 키 파일을 결합하면 된다.

cat apns-prod-cert.pem apns-prod-key-noenc.pem > apns-prod.pem

를 입력하자.


ps. 하지만 실상 node.js apns 에서 필요한 파일은
apns-prod-cert.pem 파일과 apns-prod-key-noenc.pem 파일만 있으면 된다.

수고했다.


'node.js' 카테고리의 다른 글

node.js 에서 debugger 를 사용해보자.  (0) 2012.10.26
node.js 설치 방법 및 샘플  (0) 2012.07.09
Posted by 다오나무
node.js2012. 10. 26. 13:30

cloud9 을 통합환경으로 쓰고 있는데

syntax-highlighting만 겨우 지원하는 무거운 노트패드 같다.
의도와는 다르게 디버깅(watch, breakpoint 등)이 잘 돌아가지 않고 있다.
node-inspector 를 쓰면 좋다.
chrome 의 디버거와 거의 똑같이 생겨서 익숙하다.

먼저 설치
$ npm install node-inspector

실행해보자.
디버깅을 위한 거니까 server 기동도 디버그 모드로 띄운다.
$ node --debug server.js

그리고 inspector 를 띄운다.
$ node-inspector --web-port=3001
visit http://0.0.0.0:3001/debug?port=5858 to start debugging

친절하게 안내해준다.
디버그 포트는 기본이 5858 이니까 혹여 변경했다면 알아서 인자를 바꿔주자.

크고 아름답다.

'node.js' 카테고리의 다른 글

node.js용 iOS 푸쉬 인증서를 생성해 보자.  (0) 2012.10.31
node.js 설치 방법 및 샘플  (0) 2012.07.09
Posted by 다오나무
iOS2012. 10. 23. 13:44

원문(리스토어와 인엡 풀소스) - http://www.changwoo.net/bbs/bbsDetail.do?&num=545

애플의 정책이 바뀌어 non-consume in-app은 무조건 restore(복구) UI가 있어야 합니다, 안그러면 리젝사유가 되어 가슴아픈 경험을 하게 됩니다.

그에 따른 로직을 올립니다.

버튼에 이벤트로 
- (void) onClickRestore:(id)sender 를 호출하면
checkPurchasedItems -> 
 상황1 - 로그인 취소- > 
(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error  
 상황2  - 로그인 성공 -> (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

요런 로직입니당
로그인이 성공하면
paymentQueueRestoreCompletedTransactionsFinished함수에서 그동안 구입한 인엡에 대한 목록(product id)을 얻어옵니다
그러면 콜백받은 인엡목록과 본어플의 인엡의 코드(product id)를 검사해서 있는지 확인한후 처리 하시면 되겠습니다.




//복구 버튼 이벤트
- (
void) onClickRestore:(id)sender
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
    NSString *currentLanguage = [languages objectAtIndex:0];
     
    NSString *requestString = @"";
    //Language process
    if ([currentLanguage isEqualToString:@"ko"]) {
        //        requestString = @"복구 요청중";
    }else{
        //        requestString = @"Restore requesting";
    }
     
    HUD = [[MBProgressHUD alloc] initWithWindow:[[UIApplication sharedApplication] keyWindow]];
    //    HUD.center = CGPointMake(10, 110);
    [[[UIApplication sharedApplication] keyWindow] addSubview:HUD];
    HUD.delegate = self;
    HUD.labelText = requestString;
    [HUD show:YES];   
     
    [self checkPurchasedItems];
}
 
- (void) checkPurchasedItems
{
     
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
    [HUD show:NO];
     
}// Call This Function
 
- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions
{
    NSLog(@"- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions ");
}
// Sent when an error is encountered while adding transactions from the user's purchase history back to the queue.
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
    NSLog(@"- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error ");   
    [HUD hide:YES];
}
// Then this is called
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
    NSLog(@"%@",queue );
    NSLog(@"Restored Transactions are once again in Queue for purchasing %@",[queue transactions]); 
     
    NSMutableArray *purchasedItemIDs = [[NSMutableArray alloc] init];
    NSLog(@"received restored transactions: %i", queue.transactions.count);
     
     
    //결재 기록이 없을때 alert 뛰우기
    if(queue.transactions.count==0){
        //        NSString *fileMessage = NSLocalizedString(@"NOTRESTORE", @"restore");
         
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
        NSString *currentLanguage = [languages objectAtIndex:0];
         
        NSString *failMessage;
        //Language process
        if ([currentLanguage isEqualToString:@"ko"]) {
            failMessage = @"구매 기록이 없습니다.";
        }else{
            failMessage = @"There is no record of your purchase.";
        }
         
        UIAlertView *resultView = [[UIAlertView alloc] initWithTitle:@"Failed"
                                                             message:failMessage
                                                            delegate:self
                                                   cancelButtonTitle:nil
                                                   otherButtonTitles:@"OK", nil];
        [resultView show];
    }
     
    for (SKPaymentTransaction *transaction in queue.transactions)
    {
        NSString *productID = transaction.payment.productIdentifier;
        [purchasedItemIDs addObject:productID];
        NSLog (@"product id is %@" , productID);
        // here put an if/then statement to write files based on previously purchased items
        // example if ([productID isequaltostring: @"youruniqueproductidentifier]){write files} else { nslog sorry}
         
        if([productID isEqualToString:KONGLISH_PRODUCTID])
        {
            //재구입확인dh
            NSLog(@"already buy");
        }
    
     
    [HUD hide:YES];
     
}







  • 2012/06/25 11:57답글

    신고

    유용하게 잘 사용했습니다~
    더 요약하자면 핵심은 이거죠

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];//영구복원 실행

    - (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
    {
    if(error.code!=SKErrorPaymentCancelled)
    {
    //에러
    }
    else {
    //유저 취소시
    }
    }

    // Then this is called
    - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
    {
    if(queue.transactions.count==0){
    //구매한 영구아이템이 없을경우
    return;
    }

    for (SKPaymentTransaction *transaction in queue.transactions)
    {
    //구매한 아이템들에 대한 복원 처리 


    }

  • 2012/07/02 22:15답글

    신고

    깔끔하군요 굿좝~~

Posted by 다오나무
iOS2012. 10. 22. 15:19

효과음에 사용되는 함수는 다음 세가지다

  • AudioServicesCreateSystemSoundID
  • AudioServicesPlaySystemSound
  • AudioServicesDisposeSystemSoundID

  • 애플은 이 함수들에 대해 다음의 몇 가지 제한을 두고 있다.

  • 30초 이하의 재생시간
  • 선형 PCM 파일이나 IMA4 형식
  • 확장자가 .caf, .aif 또는 .wav 일 것
  •  
     위 함수들은 시스템 사운드 서비스가 제공하고, Audio Toolbox 프레임워크에 속한다. 그렇기 때문에 이 함수를 사용하려면 Audio ToolBox 프레임워크를 프로젝트에 추가해야 한다.

     그리고 헤더 파일인 <AudioToobBox/AudioServices.h> 파일도 #import로 포함시키자.
     시스템 사운드 서비스는 사운드를 구별하는 식별자로 SystemSoundID라는 데이터 타입을 이용한다.
     그리고 AudioServicesCreateSystemSoundID 함수는 이 식별자를 생성하는데 사용한다.

     <SystemSoundViewController.m>
      // sound
      SystemSoundID m_SndID;
      
      id sndPath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"aiff" inDirectory:@"/"];
      // URL 타입 생성
      CFURLRef baseURL = (__bridge CFURLRef)[[NSURL alloc] initFileURLWithPath:sndPath];
      // SoundID 생성
      AudioServicesCreateSystemSoundID(baseURL, &m_sndID);

     앞의 코드는 어플리케이션 번들의 sound.aiff 파일로 사운드 식별자를 하나 생성한다. 재생을 위해서는 다음 코드와 같이 AudioServicesPlaySystemSound를 이용한다.

     -(void) onPlaySound:(id)sender {
        // 사운드 재생
        AudioServicesPlaySystemSound(m_sndID);
      }

      AudioServicesPlaySystemSound(m_sndID); 처럼 AudioServicesPlaySystemSound  함수를 호출하면 바로 소리가 재생된다. 하지만 이 함수로는 자동으로 재생을 반복하거나, 재생 중에 볼륨을 조절하는 등의 제어는 할 수 없다.
      생성한 사운드가 더 이상 필요하지 않을 때는 자원을 해제시켜서 시스템의 메모리 소모를 줄이다.

      - (void)dealloc {
        // 자원 해제
        if(m_sndID) {
            AudioServicesDisposeSystemSoundID(m_sndID);
        }
        [super dealloc];
      }


    Posted by 다오나무
    iOS2012. 10. 22. 15:15

    System sound를 사용할 경우...

    App에서 system sound를 하나만 사용하면 상관 없으나 여러개를 자주 사용 할 경우에는 바로바로 resource를 해제 시켜줘야 memory 낭비를 막을 수 있다.

    즉, app이 종료될 때 알아서 resource를 해제시키지만 app이 실행 되는 중에는 resource가 계속 생기므로 실시간으로 해제를 해줘야 한다는 것...(이해한 바로는)

    따라서 call back 함수를 등록해 두고 재생이 끝나면 바로 해제를 시켜준다.
    방법은  AudioServicesAddSystemSoundCompletion 를 통해 call back 을 등록하고
    call back 내부에서 
    AudioServicesRemoveSystemSoundCompletion 와 AudioServicesDisposeSystemSoundID를 호출해준다(순서를 바꾸면 안됨)
    call back의 이름은 상관없으나 인자형식은 유지해야 하는 듯 하다.(SystemSoundIDvoid*)
    자세한 내용은 AudioServicesAddSystemSoundCompletion의 reference를 참고.

    /**

     *

     * System Sound call back method

     */

    static void completionCallback(SystemSoundID soundID, void* mySelf)

    {

        AudioServicesRemoveSystemSoundCompletion(soundID);   // 순서 주의!

        AudioServicesDisposeSystemSoundID(soundID);

    }
     


    NSString *path = [[NSBundle mainBundle]pathForResource:effectName ofType:file];

    NSURL *url = [[NSURL allocinitFileURLWithPath:path];

    SystemSoundID soundID;

    AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &soundID);

    AudioServicesAddSystemSoundCompletion(soundID, NULLNULLcompletionCallbackNULL);   // 종료 call back 등록

    AudioServicesPlaySystemSound(soundID);

    Posted by 다오나무
    iOS2012. 10. 22. 13:37

     iOS 이전에는 모든 모달뷰를 제거하는데 parentView를 타고 올라가서 dismiss를 하는 방법을 사용했습니다.

    하지만 iOS5로 버전이 올라가면서 parentView에 직접 dismiss를 하는것이 불가능해졌습니다.

    그렇기 때문에 다른 방법을 통해서 parent의 ViewController로 접근하여 [self dismissModalViewController]를 호출해야합니다.

    이를 해결하기 위해 NSNotification을 사용합니다.


     === parent View Controller ===

    - (void)viewDidLoad

    {

        [super viewDidLoad];

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(dismiss) 

    name:@"BACKTOINDEXNOTE" object:nil];

    }


    -(void)dismiss

    {

        [self dismissModalViewControllerAnimated:YES];

    }


     위와같이 dismiss를 하고싶은 ViewController에서 NSNotificationCenter에 옵저버를 등록합니다. NotificationCenter에 신호가 post되면 dismiss라고 설정한 메서드 내의 코드를 수행하도록 했습니다.

     이제 자신이 원하는 순간에 NSNotificationCenter에 등록되어있는 "BACKTOINDEXNOTE" 에 대해 post를 해줍니다.


    - (IBAction)homeButton:(id)sender{

        [self setModalTransitionStyle:UIModalTransitionStyleCoverVertical];

        

        NSNotification * notification = [NSNotification notificationWithName:@"BACKTOINDEXNOTE" object:nil];

        [[NSNotificationCenter defaultCenterpostNotification:notification];

    }


     예시에는 홈버튼을 누르면 실행되는 메서드에서 노티를 보내도록 했습니다. 이와같은 방법을 통해 iOS5에서도 복수개의 모달뷰를 제거할 수 있습니다.

    'iOS' 카테고리의 다른 글

    IOS 기반 어플 효과음 재생  (0) 2012.10.22
    AudioService resource 해제  (0) 2012.10.22
    table view 2개 사용하기  (0) 2012.10.18
    Mime Types  (1) 2012.10.05
    AVAudioSession의 Category가 각각 무엇을 의미하는지 궁금합니다.  (0) 2012.10.05
    Posted by 다오나무
    iOS2012. 10. 18. 16:32

    그냥 좀 간단한 list 같은 object 는 없나요?  tableview 가 생각보다 처음 쓰기에 복잡하네요.

    지금 전 하나의 view 에 2가지 독립된 data 리스트를 보여주고 각각 입력하고 삭제하고 그런 일을 하려고 하는데요.
    그래서 2개의 NSMutableArray를 만들어서 data 를 처리해서 첫번째 tableview 에는 잘 연결되서 제가 원하는 데로 작동합니다.
    근데 두번째 tableview에는 연결하려고 하는데 잘 모르겠어요.

    인터페이스로는 그냥 UIViewController 를 쓰고 있구요. UITableViewController 는 안씁니다.

    어떻게 하는지 좀 구체적으로 설명해주면 저같이 얼마 안된 iphone 개발자에게 너무 도움이 많이 될꺼 같아요.

    감사합니다.


    자답: 
    이런식으로 하니 되네요.

    tableview 함수에 
    if(tableviwe == myTable1){
      //처리
    }else if(tableviwe == myTable1){
      //처리
    }



    Posted by 다오나무
    php2012. 10. 17. 16:52

    글 목록을 보여줄 때 현재 시간으로 보여주는 경우도 많지만 많은 SNS에서 지금으로부터 얼마 전에 써진 글인지 표시해주는 경우도 많습니다.
    이런 경우에 사용할 수 있는 함수 예제입니다.

    function readableTime($datetime) {
      $sec = time() - strtotime($datetime);
      if($sec < 60) return $time . '초';
      $min = $sec / 60;
      if($min < 60) return intval($min) . '분';
      $hour = $min / 60;
      if($hour < 24) return intval($hour) . '시간';
      $day = $hour / 24;
      if($day < 7) return intval($day) . '일';
      $week = $day / 7;
      if($time < 5) return intval($week) . '주';
      $month = $day / 30;
      if($month < 24) return intval($month) . '개월';
      $year = $day / 365;
      return intval($year) . '년';
    }

    Posted by 다오나무
    php2012. 10. 14. 20:42

    FTP함수의  종류와  사용법  

    (1)  ftp_connect  :  FTP서버에  연결한다.  
    -----------------------------------------------  
    int  ftp_connect  (string  host  [,  int  port])  
    $ftp=ftp_connect("서버주소  또는  도메인명",21);  
    -----------------------------------------------  

    (2)  ftp_login  :  계정과  패스워드로  서버에  접근한다.  
    -----------------------------------------------  
    int  ftp_login  (int  ftp_stream,  string  username,  string  password)  
    $ftplogin  =  ftp_login($ftp,  "$ftp_user_name",  "$ftp_user_pass");  
    -----------------------------------------------  

    (3)  ftp_pwd  :  현재  디렉토리  값을  리턴한다.  
    -----------------------------------------------  
    int  ftp_pwd  (int  ftp_stream)  
    $ftp_dir  =  $ftp_pwd($ftp);  
    -----------------------------------------------  

    (4)  ftp_cdup  :  가장  상위  디렉토리로  이동  
    -----------------------------------------------  
    int  ftp_cdup  (int  ftp_stream)  
    $ftp_dir  =  $ftp_cdup($ftp);  
    -----------------------------------------------  

    (5)  ftp_chdir  :  FTP  디렉토리의  변경  
    -----------------------------------------------  
    int  ftp_chdir  (int  ftp_stream,  string  directory)  
    $chdir=ftp_chdir  ($ftp,  $ftp_dir);  
    -----------------------------------------------  

    (6)  ftp_mkdir  :  디렉토리를  만들고  만든  디렉토리명을  반환한다.  
    -----------------------------------------------  
    string  ftp_mkdir  (int  ftp_stream,  string  directory)  
    $mkdir  =  ($ftp,"만들  디렉토리명");  
    -----------------------------------------------  

    (7)  ftp_rmdir  :  디렉토리를  삭제한다.  
    -----------------------------------------------  
    int  ftp_rmdir  (int  ftp_stream,  string  directory)  
    $mkdir  =  ($ftp,"삭제할  디렉토리명");  
    -----------------------------------------------  

    (8)  ftp_nlist  :  디렉토리의  파일이름을  배열로  반환한다.  
    -----------------------------------------------  
    int  ftp_nlist  (int  ftp_stream,  string  directory)  
    $contents  =  ftp_nlist(  $ftp,  "디렉토리명");  
    -----------------------------------------------  

    (9)  ftp_rawlist  :  디렉토리의  파일이름과  읽고  쓰고  실행할  권한을  파일  당  한  줄의  배열로  반환한다.  
    -----------------------------------------------  
    int  ftp_rawlist  (int  ftp_stream,  string  directory)  
    $contents  =  ftp_nlist(  $ftp,  "디렉토리명");  
    -----------------------------------------------  

    (10)  ftp_systype  :  FTP서버의  타입을  리턴하는데  리눅스는  UNIX로  표시해준다.  
    -----------------------------------------------  
    int  ftp_systype  (int  ftp_stream)  
    echo  ftp_systype($ftp);  
    -----------------------------------------------  

    (11)  ftp_get  :  FTP로부터  파일을  다운로드  받는다.  
    -----------------------------------------------  
    int  ftp_get  (int  ftp_stream,  string  local_file,  string  remote_file,  int  mode)  
    $download  =  ftp_get($ftp,  "저장할  파일명",  "다운받을  파일명","FTP_ASCII  or  FTP_BINARY");  
    -----------------------------------------------  

    .pl  또는  .cgi  같은  Perl  CGI인  경우에는  FTP_ASCII로  다운  받고  다른  파일은  FTP_BINARY로  다운  받아야  한다.  

    (12)  ftp_fget  :  FTP로부터  파일  포인터를  다운받는다.  
    -----------------------------------------------  
    int  ftp_fget  (int  ftp_stream,  int  fp,  string  remote_file,  int  mode)  
    $download  =  ftp_fget($ftp,  "저장할  파일명",  "다운받을  파일명","FTP_ASCII  or  FTP_BINARY");  
    -----------------------------------------------  

    (13)  ftp_put  :  FTP서버에  파일을  업로드  한다.  
    -----------------------------------------------  
    int  ftp_put  (int  ftp_stream,  string  remote_file,  string  local_file,  int  mode)  
    $upload  =  ftp_put($ftp,  "업로드할  파일명",  "업로드될  파일명","FTP_ASCII  or  FTP_BINARY");  
    -----------------------------------------------  

    (14)  ftp_fput  :  FTP서버에  파일  포인터를  업로드한다.  
    -----------------------------------------------  
    int  ftp_fput  (int  ftp_stream,  string  remote_file,  string  local_file,  int  mode)  
    $upload  =  ftp_fput($ftp,  "업로드할  파일명",  "업로드될  파일명","FTP_ASCII  or  FTP_BINARY");  
    -----------------------------------------------  

    (15)  ftp_size  :  파일의  사이즈를  구한다.  
    -----------------------------------------------  
    int  ftp_size  (int  ftp_stream,  string  remote_file)  
    $filesize  =  ftp_size(  $ftp,  $contents[$i]  );  
    -----------------------------------------------  
    ftp_nlist  나  ftp_rawlist에  의해  구한  파일명에  대한  배열값인  $contents[$i]에는  각  파일명과  속성이  저장되어지는데  이  파일명을  사이즈로  구하면  파일이면  사이즈가  리턴되고  디렉토리이면  -1이  리턴된다.  

    (16)  ftp_mdtm  :  파일의  마지막  수정시간을  timestamp  값으로  리턴한다.  
    -----------------------------------------------  
    int  ftp_mdtm  (int  ftp_stream,  string  remote_file)  
    $filemdth  =  ftp_size(  $ftp,  "파읾명");  
    -----------------------------------------------  

    (17)  ftp_rename  :  파일명을  변경한다.  
    -----------------------------------------------  
    int  ftp_rename  (int  ftp_stream,  string  from,  string  to)  
    $rename  =  ftp_rename(  $ftp,  "바꿀  파일명",  "바뀐  후  파일명");  
    -----------------------------------------------  

    (18)  ftp_delete  :  해당  파일을  삭제한다.  
    -----------------------------------------------  
    int  ftp_delete  (int  ftp_stream,  string  path)  
    $delfile  =  ftp_delete($ftp,  "지울  파일명");  
    -----------------------------------------------  

    (19)  ftp_quit  :  연결된  FTP의  접속을  끊는다.  
    -----------------------------------------------  
    int  ftp_quit  (int  ftp_stream)  
    ftp_quit  ($ftp);  
    -----------------------------------------------  

    Posted by 다오나무