nosilence 发表于 2015-5-27 11:09:24

iPhone开发笔记——FTP上传文件



  #import
  enum {
    kSendBufferSize = 32768
};
  @interface PutController : UIViewController
{
   
    NSOutputStream *            _networkStream;
    NSInputStream *             _fileStream;
    uint8_t                     _buffer;
    size_t                      _bufferOffset;
    size_t                      _bufferLimit;
}
  - (void)sendAction;
  @end
  
  ------------------------------------------------------
  
  #import "PutController.h"
  #import "FtpUploadDemoAppDelegate.h"
  #include
  @interface PutController ()
  // Properties that don't need to be seen by the outside world.
  @property (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;
  @end
  @implementation PutController
  #pragma mark * Status management
  // These methods are used by the core transfer code to update the UI.
  - (void)_sendDidStart
{
   // [ didStartNetworking];
}
  - (void)_updateStatus:(NSString *)statusString
{
    assert(statusString != nil);
}
  - (void)_sendDidStopWithStatus:(NSString *)statusString
{
    if (statusString == nil) {
      statusString = @"Put succeeded";
    }
//[ didStopNetworking];
}
  #pragma mark * Core transfer code
  // This is the code that actually does the networking.
  @synthesize 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([ fileExistsAtPath:filePath]);
//assert( || );
   
    assert(self.networkStream == nil);      // don't tap send twice in a row!
    assert(self.fileStream == nil);         // ditto
  // First get and check the URL.
   
    url = ;
    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) , 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 = ;
      assert(self.fileStream != nil);
      
      ;
      
      // Open a CFFTPStream for the URL.
  ftpStream = CFWriteStreamCreateWithFTPURL(NULL, (CFURLRef) url);
      assert(ftpStream != NULL);
      
      self.networkStream = (NSOutputStream *) ftpStream;
  success = ;
            assert(success);
            success = ;
            assert(success);
  self.networkStream.delegate = self;
       forMode:NSDefaultRunLoopMode];
      ;
  // 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.
      
      ;
    }
}
  - (void)_stopSendWithStatus:(NSString *)statusString
{
    if (self.networkStream != nil) {
       forMode:NSDefaultRunLoopMode];
      self.networkStream.delegate = nil;
      ;
      self.networkStream = nil;
    }
    if (self.fileStream != nil) {
      ;
      self.fileStream = nil;
    }

    ;
}
  - (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: {
            ;
      } break;
      case NSStreamEventHasBytesAvailable: {
            assert(NO);   // should never happen for the output stream
      } break;
      case NSStreamEventHasSpaceAvailable: {
            ;
         
            // If we don't have any data buffered, go read the next chunk of data.
         
            if (self.bufferOffset == self.bufferLimit) {
                NSInteger   bytesRead;
               
                bytesRead = ;
               
                if (bytesRead == -1) {
                  ;
                } else if (bytesRead == 0) {
                  ;
                } 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 = maxLength:self.bufferLimit - self.bufferOffset];
                assert(bytesWritten != 0);
                if (bytesWritten == -1) {
                  ;
                } else {
                  self.bufferOffset += bytesWritten;
                }
            }
      } break;
      case NSStreamEventErrorOccurred: {
            ;
      } break;
      case NSStreamEventEndEncountered: {
            // ignore
      } break;
      default: {
            assert(NO);
      } break;
    }
}
  #pragma mark * Actions
  - (void)sendAction
{
NSLog(@"aesr");
//assert( ] );
  if ( ! self.isSending ) {
      NSString *filePath;
      
      // User the tag on the UIButton to determine which image to send.
      
      filePath = ;
filePath = ;
NSLog(@"%@",filePath);
      assert(filePath != nil);
      
      ;
    }
}
  
@end
页: [1]
查看完整版本: iPhone开发笔记——FTP上传文件