iOS ftp上传文件

本文介绍了一个iOS应用如何通过FTP协议上传视频文件的过程。利用NSStream进行数据传输,并使用SCRFTPRequest进行更高级别的FTP交互。文章详细展示了连接建立、数据读取与写入等关键步骤。

one:

#import "ViewController.h"

#import "CFNetwork.h"

#import "AssetsLibrary.h"


enum {

    BufferSize = 32768

};

@interface ViewController ()

{

    uint8_t buffer[BufferSize];

    size_t  bufferOffset;

    size_t  bufferLimit;

}

@property (nonatomic,strong)NSURL *url;

@property (nonatomic,strong)NSString *account;

@property (nonatomic,strong)NSString *password;

@property (nonatomic,retain)NSInputStream  *fileStream;

@property (nonatomic,retain)NSOutputStream *networkStream;

@property (nonatomic,strong)NSString *path;

@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    

    self.url = [NSURLURLWithString:@"ftp://113.155.30.171"];

    self.account =@"XXX";

    self.password =@"XXXXX";

    self.path= [[NSBundlemainBundle] pathForResource:@"testvideo"ofType:@"MOV"];

    NSLog(@"%@",self.path);

    // Do any additional setup after loading the view, typically from a nib.

}


- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}




- (void)stopSendWithStatus:(NSString *)statusString

{

    if (self.networkStream !=nil) {

        [self.networkStreamremoveFromRunLoop:[NSRunLoopcurrentRunLoop] forMode:NSDefaultRunLoopMode];

        self.networkStream.delegate =nil;

        [self.networkStreamclose];

        self.networkStream =nil;

    }

    if (self.fileStream !=nil) {

        [self.fileStreamclose];

        self.fileStream =nil;

    }

    

}


- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode

// An NSStream delegate callback that's called when events happen on our

// network stream.

{

#pragma unused(aStream)

    assert(aStream == self.networkStream);

    

    switch (eventCode) {

        caseNSStreamEventOpenCompleted: {

            NSLog(@"begin");

        } break;

        caseNSStreamEventHasBytesAvailable: {

            assert(NO);    // should never happen for the output stream

        } break;

        caseNSStreamEventHasSpaceAvailable: {

            

            

            // If we don't have any data buffered, go read the next chunk of data.

            

            if (bufferLimit ==bufferOffset) {

                NSInteger   bytesRead;

                

                bytesRead = [self.fileStreamread:buffermaxLength:BufferSize];

                

                if (bytesRead == -1) {

                    [self stopSendWithStatus:@"File read error"];

                } else if (bytesRead == 0) {

                    [self stopSendWithStatus:nil];

                    NSLog(@"finish");

                } else {

                    bufferOffset = 0;

                    bufferLimit  = bytesRead;

                }

            }

            

            // If we're not out of data completely, send the next chunk.

            

            if (bufferOffset !=bufferLimit) {

                NSInteger   bytesWritten;

                bytesWritten = [self.networkStreamwrite:&buffer[bufferOffset]maxLength:bufferLimit -bufferOffset];

                assert(bytesWritten != 0);

                if (bytesWritten == -1) {

                    [self stopSendWithStatus:@"Network write error"];

                } else {

                    bufferOffset += bytesWritten;

                }

            }

        } break;

        caseNSStreamEventErrorOccurred: {

            [selfstopSendWithStatus:@"Stream open error"];

        } break;

        caseNSStreamEventEndEncountered: {

            // ignore

        } break;

        default: {

            assert(NO);

        } break;

    }


    

    

 


}


-(void) stopSendWithStatus

{

    if(self.networkStream !=nil){

        [self.networkStreamremoveFromRunLoop:[NSRunLoopcurrentRunLoop] forMode:NSDefaultRunLoopMode];

    self.networkStream.delegate =nil;

    [self.networkStreamclose];

    self.networkStream =nil;

    }

    if(self.fileStream !=nil)

    {

        [self.fileStreamclose];

        self.fileStream =nil;

    }


}


#pragma mark 系统视频路径

-(void) getSystem

{

    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"VideoURL"];

    NSLog(@"%@",path);

}


-(IBAction)connect:(id)sender

{

    

    BOOL    success;

//    NSURL   *url;

    NSLog(@"path is %@",self.path);

    

    assert(self.path !=nil);

    assert([[NSFileManagerdefaultManager] fileExistsAtPath:self.path]);

    assert(self.networkStream ==nil);

    assert(self.fileStream ==nil);

    success = (self.url !=nil);

    if (success) {

        self.url =CFBridgingRelease(

                                CFURLCreateCopyAppendingPathComponent(NULL, (__bridgeCFURLRef) self.url, (__bridgeCFStringRef) @"/123",true)

                                );

        success = (self.url !=nil);

    }

    

    if(! success)

        NSLog(@"invalid Url");

    else

    {

        self.fileStream = [NSInputStreaminputStreamWithFileAtPath:self.path];

        assert(self.fileStream !=nil);

        [self.fileStreamopen];

        self.networkStream =CFBridgingRelease(

                                               CFWriteStreamCreateWithFTPURL(NULL, (__bridgeCFURLRef) self.url));

    }

    

    assert(self.networkStream !=nil);

    success =  [self.networkStreamsetProperty:self.accountforKey:(id)kCFStreamPropertyFTPUserName];

    assert(success);

    success =  [self.networkStreamsetProperty:self.passwordforKey:(id)kCFStreamPropertyFTPPassword];

    assert(success);

    

    self.networkStream.delegate =self;

    [self.networkStreamscheduleInRunLoop:[NSRunLoopmainRunLoop] forMode:NSDefaultRunLoopMode];

    [self.networkStreamopen];


}




-(IBAction)upload:(id)sender

{

    self.url =CFBridgingRelease(CFURLCreateCopyAppendingPathComponent(NULL, (CFURLRef)self.url, (CFStringRef)[self.pathlastPathComponent], false));

    NSString *str = [self.urlabsoluteString];

    NSLog(@"STR IS %@",str);

    

    

    SCRFTPRequest *ftpRequest = [[SCRFTPRequestalloc] initWithURL:[NSURLURLWithString:@"ftp://113.142.30.171"]

                                                      toUploadFile: self.path];

    

    ftpRequest.username self.account;

    ftpRequest.password self.password;

    

    // Specify a custom upload file name (optional)

    ftpRequest.customUploadFileName = [self.pathlastPathComponent];

    

    // The delegate must implement the SCRFTPRequestDelegate protocol

    ftpRequest.delegate = self;  

    

    [ftpRequest startRequest];

}

// Required delegate methods

- (void)ftpRequestDidFinish:(SCRFTPRequest *)request {

    

    NSLog(@"Upload finished.");

}


- (void)ftpRequest:(SCRFTPRequest *)request didFailWithError:(NSError *)error {

    

    NSLog(@"Upload failed: %@", [errorlocalizedDescription]);

}


// Optional delegate methods

- (void)ftpRequestWillStart:(SCRFTPRequest *)request {

    

    NSLog(@"Will transfer %d bytes.", request.fileSize);

}


- (void)ftpRequest:(SCRFTPRequest *)request didWriteBytes:(NSUInteger)bytesWritten {

    

    NSLog(@"Transferred: %d", bytesWritten);

}


- (void)ftpRequest:(SCRFTPRequest *)request didChangeStatus:(SCRFTPRequestStatus)status {

    

    switch (status) {

        caseSCRFTPRequestStatusOpenNetworkConnection:

            NSLog(@"Opened connection.");

            break;

        caseSCRFTPRequestStatusReadingFromStream:

            NSLog(@"Reading from stream...");

            break;

        caseSCRFTPRequestStatusWritingToStream:

            NSLog(@"Writing to stream...");

            break;

        caseSCRFTPRequestStatusClosedNetworkConnection:

            NSLog(@"Closed connection.");

            break;

        caseSCRFTPRequestStatusError:

            NSLog(@"Error occurred."); 

            break

    } 

}


@end



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值