作为 Black Raccoon 的作者,也许我有偏见(好吧,我知道我有偏见),但我试图让它尽可能简单和强大。我们来看看你要做什么,上传一个文件:
上传文件需要做四件事——启动代码,然后是四个委托方法:覆盖检查、数据、成功和失败。假设您将整个文件读入内存(对于小于 2 兆的小文件可以)。
首先,你需要在你的标题中:
BRRequestUpload *uploadData; // Black Raccoon's upload object
NSData *uploadData; // data we plan to upload
现在是代码部分:
- (IBAction) uploadFile :(id)sender
{
//----- get the file path for the item we want to upload
NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filepath = [NSString stringWithFormat: @"%@/%@", applicationDocumentsDir, @"file.text"];
//----- read the entire file into memory (small files only)
uploadData = [NSData dataWithContentsOfFile: filepath];
//----- create our upload object
uploadFile = [[BRRequestUpload alloc] initWithDelegate: self];
//----- for anonymous login just leave the username and password nil
uploadFile.path = @"/home/user/myfile.txt";
uploadFile.hostname = @"192.168.1.100";
uploadFile.username = @"yourusername";
uploadFile.password = @"yourpassword";
//----- we start the request
[uploadFile start];
}
第一个将询问您的代码是否要覆盖现有文件。
-(BOOL) shouldOverwriteFileWithRequest: (BRRequest *) request
{
//----- set this as appropriate if you want the file to be overwritten
if (request == uploadFile)
{
//----- if uploading a file, we set it to YES (if set to NO, nothing happens)
return YES;
}
}
接下来,Black Raccoon 会询问您要发送的数据块。如果您有一个非常大的文件,您永远不想尝试一次性发送所有文件 - Apple 的 API 会阻塞并丢弃数据。然而,我们只有一小块,所以我们这样做:
- (NSData *) requestDataToSend: (BRRequestUpload *) request
{
//----- returns data object or nil when complete
//----- basically, first time we return the pointer to the NSData.
//----- and BR will upload the data.
//----- Second time we return nil which means no more data to send
NSData *temp = uploadData; // this is a shallow copy of the pointer
uploadData = nil; // next time around, return nil...
return temp;
}
请记住,我们只能对小文件执行此操作。
接下来我们有我们的完成处理程序(如果事情按计划进行):
-(void) requestCompleted: (BRRequest *) request
{
if (request == uploadFile)
{
NSLog(@"%@ completed!", request);
uploadFile = nil;
}
}
最后我们有我们的失败处理程序:
-(void) requestFailed:(BRRequest *) request
{
if (request == uploadFile)
{
NSLog(@"%@", request.error.message);
uploadFile = nil;
}
}
如果它像说的那么简单,那就太好了,[BRFtpUploadTo: dest srcfile: srcFile destfile: dstFile]
但有很多理由让你不应该这样做。部分原因与 Apple 如何实施其内部 FTP 有关。还有阻塞、错误等问题。最后,FTP 听起来应该是微不足道的,但最终却是一场噩梦。
FTP 是不平凡的,这就是为什么有这么多的实现。我并不是说黑浣熊是最好的,但它会在几分钟到几天之间响应问题而得到维护。
起初它可能看起来令人生畏,但在我看来,Black Raccoon 是更好的 FTP 库之一。我花了很多时间和精力使它成为对问题有出色响应的优质产品。我如何免费做到这一点?体积。;)
祝您最终使用任何 FTP 软件好运!