iPhone上传文件到ftp服务器,iPhone开发笔记——FTP上传文件

#import

enum {

kSendBufferSize = 32768

};

[email protected] PutController : UIViewController

{

NSOutputStream *            _networkStream;

NSInputStream *             _fileStream;

uint8_t                     _buffer[kSendBufferSize];

size_t                      _bufferOffset;

size_t                      _bufferLimit;

}

- (void)sendAction;

[email protected]

------------------------------------------------------

#import "PutController.h"

#import "FtpUploadDemoAppDelegate.h"

#include

[email protected] PutController ()

// Properties that don't need to be seen by the outside world.

[email protected] (nonatomic, readonly) BOOL              isSending;

@property (nonatomic, retain)   NSOutputStream *  networkStream;

@property (nonatomic, retain)   NSInputStream *   fileStream;

@property (nonatomic, readonly) uint8_t *         buffer;

@property (nonatomic, assign)   size_t            bufferOffset;

@property (nonatomic, assign)   size_t            bufferLimit;

[email protected]

[email protected] PutController

#pragma mark * Status management

// These methods are used by the core transfer code to update the UI.

- (void)_sendDidStart

{

// [[FtpUploadDemoAppDelegate sharedAppDelegate] didStartNetworking];

}

- (void)_updateStatus:(NSString *)statusString

{

assert(statusString != nil);

}

- (void)_sendDidStopWithStatus:(NSString *)statusString

{

if (statusString == nil) {

statusString = @"Put succeeded";

}

//  [[AppDelegate sharedAppDelegate] didStopNetworking];

}

#pragma mark * Core transfer code

// This is the code that actually does the networking.

[email protected] networkStream = _networkStream;

@synthesize fileStream    = _fileStream;

@synthesize bufferOffset  = _bufferOffset;

@synthesize bufferLimit   = _bufferLimit;

// Because buffer is declared as an array, you have to use a custom getter.

// A synthesised getter doesn't compile.

- (uint8_t *)buffer

{

return self->_buffer;

}

- (BOOL)isSending

{

return (self.networkStream != nil);

}

- (void)_startSend:(NSString *)filePath

{

BOOL                    success;

NSURL *                 url;

CFWriteStreamRef        ftpStream;

assert(filePath != nil);

assert([[NSFileManager defaultManager] fileExistsAtPath:filePath]);

//  assert( [filePath.pathExtension isEqual:@"png"] || [filePath.pathExtension isEqual:@"jpg"] );

assert(self.networkStream == nil);      // don't tap send twice in a row!

assert(self.fileStream == nil);         // ditto

// First get and check the URL.

url = [NSURL URLWithString:@"ftp://192.168.1.253"];

success = (url != nil);

if (success) {

// Add the last part of the file name to the end of the URL to form the final

// URL that we're going to put to.

url = [NSMakeCollectable(

CFURLCreateCopyAppendingPathComponent(NULL, (CFURLRef) url, (CFStringRef) [filePath lastPathComponent], false)

) autorelease];

success = (url != nil);

}

// If the URL is bogus, let the user know.  Otherwise kick off the connection.

if ( ! success) {

NSLog(@"invaild URL");

} else {

// Open a stream for the file we're going to send.  We do not open this stream;

// NSURLConnection will do it for us.

self.fileStream = [NSInputStream inputStreamWithFileAtPath:filePath];

assert(self.fileStream != nil);

[self.fileStream open];

// Open a CFFTPStream for the URL.

ftpStream = CFWriteStreamCreateWithFTPURL(NULL, (CFURLRef) url);

assert(ftpStream != NULL);

self.networkStream = (NSOutputStream *) ftpStream;

success = [self.networkStream setProperty:@"listen" forKey:(id)kCFStreamPropertyFTPUserName];

assert(success);

success = [self.networkStream setProperty:@"123" forKey:(id)kCFStreamPropertyFTPPassword];

assert(success);

self.networkStream.delegate = self;

[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[self.networkStream open];

// Have to release ftpStream to balance out the create.  self.networkStream

// has retained this for our persistent use.

CFRelease(ftpStream);

// Tell the UI we're sending.

[self _sendDidStart];

}

}

- (void)_stopSendWithStatus:(NSString *)statusString

{

if (self.networkStream != nil) {

[self.networkStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

self.networkStream.delegate = nil;

[self.networkStream close];

self.networkStream = nil;

}

if (self.fileStream != nil) {

[self.fileStream close];

self.fileStream = nil;

}

[self _sendDidStopWithStatus:statusString];

}

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

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

// network stream.

{

NSLog(@"asd");

#pragma unused(aStream)

assert(aStream == self.networkStream);

switch (eventCode) {

case NSStreamEventOpenCompleted: {

[self _updateStatus:@"Opened connection"];

} break;

case NSStreamEventHasBytesAvailable: {

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

} break;

case NSStreamEventHasSpaceAvailable: {

[self _updateStatus:@"Sending"];

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

if (self.bufferOffset == self.bufferLimit) {

NSInteger   bytesRead;

bytesRead = [self.fileStream read:self.buffer maxLength:kSendBufferSize];

if (bytesRead == -1) {

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

} else if (bytesRead == 0) {

[self _stopSendWithStatus:nil];

} else {

self.bufferOffset = 0;

self.bufferLimit  = bytesRead;

}

}

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

if (self.bufferOffset != self.bufferLimit) {

NSInteger   bytesWritten;

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

assert(bytesWritten != 0);

if (bytesWritten == -1) {

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

} else {

self.bufferOffset += bytesWritten;

}

}

} break;

case NSStreamEventErrorOccurred: {

[self _stopSendWithStatus:@"Stream open error"];

} break;

case NSStreamEventEndEncountered: {

// ignore

} break;

default: {

assert(NO);

} break;

}

}

#pragma mark * Actions

- (void)sendAction

{

NSLog(@"aesr");

//  assert( [sender isKindOfClass:[UIView class]] );

if ( ! self.isSending ) {

NSString *  filePath;

// User the tag on the UIButton to determine which image to send.

filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

filePath = [filePath stringByAppendingPathComponent:@"ZTE_Union_JoinMe.zip"];

NSLog(@"%@",filePath);

assert(filePath != nil);

[self _startSend:filePath];

}

}

@end

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值