【问题标题】:Xcode - iOS - Simply upload a file to FTP ServerXcode - iOS - 只需将文件上传到 FTP 服务器
【发布时间】:2013-06-14 14:37:27
【问题描述】:

我正在尝试使用 FTP 服务器。 我已经搜索了所有内容,对于像我这样的初学者来说,一切都很难理解。 SimpleFTPSample 很难理解,因为它一次太多了。视图、按钮、标签、文本字段、上传、下载、请求、列表、获取。与 BlackRaccoon 和其他所有内容相同。

如何在没有视图或按钮的 Xcode(iPhone 应用程序)中简单且程序化地将“test.txt”上传到 FTP 服务器:“192.168.1.111”。例如,可以在 ViewDidLoad 中的代码。

可能是这样的?:

NSURL* url = [NSURL URLWithString:@"ftp://username:pw@189.92.32.34"];
CFReadStreamRef stream = CFReadStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) url);
stream.delegate= self;
[stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[stream open];

但是哪个文件? 扩展它,或编写新代码。我不知道,这对我来说是新的。

谢谢乔纳森

【问题讨论】:

    标签: ios objective-c xcode ftp cfnetwork


    【解决方案1】:

    作为 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 是最好的,但它会在几分钟到几天之间响应问题而得到维护。

    一开始可能会让人望而生畏,但在我看来,Black Raccoon 是更好的 FTP 库之一。我花了很多时间和精力使它成为对问题有出色响应的优质产品。我如何免费做到这一点?体积。 ;)

    祝你最终使用任何 FTP 软件好运!

    【讨论】:

    • 在uploadFile方法中有一行写着“uploadFile.sentData = dataToUpload;”,但是sentData在GitHub上的当前代码中并不是一个属性。这是错字还是旧的设置说明?我已经离开了这条线并且能够上传几次,但它最终在几次上传后崩溃(文件不超过 4-5 个字节)。
    • 你是对的,这是一个错字。 Black Raccoon 的一个主要变化是它使用requestDataToSend 来输出数据 - 尝试 ftp 内存中 2-5 mb 的文件似乎存在一些问题。所以现在,所有数据都通过requestDataToSend。如果您可以提交包含更多信息的错误报告,我将不胜感激。
    • Black Raccoon 设计用于脱离主线程。我的印象是其他人已经让它在辅助线程下工作,但出于多种原因我正式不支持它。
    • uploadFile 方法中的uploadFile.path 是什么?是必需的吗?我们可以省略它吗?
    • 它还在工作吗?因为苹果已经弃用了很多类
    【解决方案2】:
    1. 上传时需要上传路径。这就是 FTP 的工作方式。

    2. 端口是标准的 FTP 端口。我知道在不违反 API 的情况下无法改变这一点。如果你弄清楚了,你很有可能不会通过 Apple 的检查。

    3. 此代码将上传/下载任何文件。

    4. 我不知道如何在安全的条件下进行这项工作。这使用 Apple 的 FTP 协议。还有其他 FTP 包从头开始构建它并且更加智能。我会调查他们。

    BR 的设计是因为我需要简单的 FTP 通信。白浣熊并没有为我这样做,因为当时(它已经现代化了)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2014-10-17
      • 2017-06-05
      相关资源
      最近更新 更多