-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFTPManager.m
147 lines (128 loc) · 5.06 KB
/
FTPManager.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//
// FTPManager.m
// huaHongStaff
//
// Created by 小马 on 16/10/28.
// Copyright © 2016年 基石信息. All rights reserved.
//
#import "FTPManager.h"
#import "FileManager.h"
@implementation FTPManager
- (void)createFTPRequest:(NSData *)data url:(NSString *)url{
self.imageNameStr = [NSString stringWithFormat:@"%@.png",[Common stringWithUUID]];
[FileManager creatFile:[FileManager getDocumentsDirectory] Data:data Name:self.imageNameStr];
self.filePath = [[NSString alloc]initWithFormat:@"%@/%@",[FileManager getDocumentsDirectory],self.imageNameStr];
if ([FileManager fileSizeAtPath:self.filePath]>0) {
[self filedPath:self.filePath url:[NSURL URLWithString:url]];
}
}
/*
filedPath 图片路径
url ftp服务器的地址
*/
- (void)filedPath:(NSString *)filedPath url:(NSURL *)url{
CFWriteStreamRef ftpStream;
//添加后缀(文件名称)
url = (__bridge NSURL *)(CFURLCreateCopyAppendingPathComponent(NULL, (CFURLRef) url, (CFStringRef) [filedPath lastPathComponent], false));
//读取文件,转化为输入流
self.fileStream = [NSInputStream inputStreamWithFileAtPath:filedPath];
[self.fileStream open];
//为url开启CFFTPStream输出流
ftpStream = CFWriteStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) url);
self.networkStream = (__bridge NSOutputStream *) ftpStream;
//设置ftp账号密码
[self.networkStream setProperty:FTPUserName forKey:(id)kCFStreamPropertyFTPUserName];
[self.networkStream setProperty:FTPUserPassWord forKey:(id)kCFStreamPropertyFTPPassword];
//设置networkStream流的代理,任何关于networkStream的事件发生都会调用代理方法
self.networkStream.delegate = self;
//设置runloop
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.networkStream open];
//完成释放链接
CFRelease(ftpStream);
}
#pragma mark 回调方法
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
uint8_t buffer[32768];
//aStream 即为设置为代理的networkStream
switch (eventCode) {
case NSStreamEventOpenCompleted: {
//开启连接
NSLog(@"NSStreamEventOpenCompleted");
} break;
case NSStreamEventHasBytesAvailable: {
NSLog(@"NSStreamEventHasBytesAvailable");
assert(NO); // 在上传的时候不会调用
} break;
case NSStreamEventHasSpaceAvailable: {
//正在传输
NSLog(@"NSStreamEventHasSpaceAvailable");
NSLog(@"bufferOffset is %zd",self.bufferOffset);
NSLog(@"bufferLimit is %zu",self.bufferLimit);
if (self.bufferOffset == self.bufferLimit) {
NSInteger bytesRead;
bytesRead = [self.fileStream read:buffer maxLength:32768];
if (bytesRead == -1) {
//读取文件错误
[self _stopSendWithStatus:@"读取文件错误"];
} else if (bytesRead == 0) {
//文件读取完成 上传完成
[self _stopSendWithStatus:nil];
} else {
self.bufferOffset = 0;
self.bufferLimit = bytesRead;
}
}
if (self.bufferOffset != self.bufferLimit) {
//写入数据
NSInteger bytesWritten;//bytesWritten为成功写入的数据
bytesWritten = [self.networkStream write:&buffer[self.bufferOffset] maxLength:self.bufferLimit - self.bufferOffset];
assert(bytesWritten != 0);
if (bytesWritten == -1) {
[self _stopSendWithStatus:@"网络写入错误"];
} else {
self.bufferOffset += bytesWritten;
}
}
} break;
case NSStreamEventErrorOccurred: {
[self _stopSendWithStatus:@"Stream打开错误"];
// assert(NO);
} break;
case NSStreamEventEndEncountered: {
// 忽略
} break;
default: {
assert(NO);
} break;
}
}
//结果处理
- (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)_sendDidStopWithStatus:(NSString *)statusString
{
// if (statusString == nil) {
// statusString = @"上传成功";
// NSLog(@"上传成功");
// }else{
// NSLog(@"上传不成功");
// }
if ([_delegate respondsToSelector:@selector(FTPManagerSendDidStopWithStatus:imageName:)]) {
[_delegate FTPManagerSendDidStopWithStatus:statusString imageName:self.filePath];
}
}
@end