最新iOS dropbox sdk的大尺寸图片上传问题

时间:2015-10-30 06:43:11

标签: ios objective-c dropbox

我正在尝试使用最新的iOS dropbox sdk在Dropbox上上传4到5 MB大小的图片。但每次我得到错误代码= -1001无法完成操作。 我的互联网连接速度足够公平(2 mbps)。

我还试过将图像大小减小到512kb并上传。但是,如果我尝试按顺序上传5或6张图像,则在成功上传2或3张图像后会出现相同的错误。

我尝试过使用以下方法。

[self.restClient uploadFile:filename toPath:destDir withParentRev:nil fromPath:localPath]

[self.restClient uploadFileChunk:nil offset:0 fromPath:localPath]

1 个答案:

答案 0 :(得分:0)

根据documentation a -1001错误意味着NSURLErrorTimedOut,意味着连接花费的时间太长。有许多因素可以促成这一点,包括设备,设备的网络堆栈和Internet连接,ISP与目标服务器之间的特定路由等。

说到您的Internet连接,您只能以Internet服务提供商(ISP)允许的速度上传。与下载速度相比,消费者ISP通常提供较少的上传速度。除此之外,您的速度可能比您的ISP评级速度慢。有时重置或重试连接可以获得不同的路径和更快的速度,但这超出了我们的控制范围。一些ISP也会限制持续连接,因此如果您看到初始高连接速度,然后是较低速度,那可能就是原因。

使用uploadFile时,您尝试在一个HTTPS请求中上传整个文件。如果文件足够大,以及上述注意事项,这可能会使请求花费太长时间而失败。出于这个原因,分块上传可能会更好。

使用uploadFileChunk时,您只是尝试按HTTPS请求上传文件的一部分,这意味着每个请求都不需要花费很长时间并且不太可能失败。< / p>

在任何一种情况下,还有一件事需要注意的是您尝试同时发出多少请求。如果您同时运行太多,它们可能都会减速,从而导致这些故障。在这种情况下,您将要限制并发运行的数量。一些开发人员选择4个并发连接的限制,但是应用程序的正确数量将取决于方案的具体情况,因此您可能想尝试一些不同的数字。

编辑,这是使用分块上传的一些基本示例代码:

- (void) doTest {

    if ([[DBSession sharedSession] isLinked]) {
        NSLog(@"Running test...");

        // Write a file to the local documents directory
        NSString *text = @"Hello world. Usually something much longer here.";
        NSString *filename = @"working-draft.txt";
        NSString *localDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
        self.localPath = [localDir stringByAppendingPathComponent:filename];
        [text writeToFile:self.localPath atomically:YES encoding:NSUTF8StringEncoding error:nil];

        self.dbClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
        self.dbClient.delegate = self;

        // Start the upload. No upload ID known yet
        [self.dbClient uploadFileChunk:nil offset:0 fromPath:self.localPath];

    }


}

- (void)restClient:(DBRestClient *)client uploadedFileChunk:(NSString *)uploadId newOffset:(unsigned long long)offset
          fromFile:(NSString *)localPath expires:(NSDate *)expiresDate {

    NSLog(@"uploadedFileChunk: %@, newOffset: %llu, fromFile: %@, expires: %@", uploadId, offset, localPath, expiresDate);

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSDictionary *attrs = [fileManager attributesOfItemAtPath:self.localPath error: NULL];

    // in real use, there's probably a dangerous race condition here in checking the size each time, but this is just for demonstration purposes
    if (offset >= [attrs fileSize]) {
        // all data has been uploaded
        NSLog(@"Finishing upload...");
        [self.dbClient uploadFile:@"chunked_uploaded_file.txt" toPath:@"/" withParentRev:nil fromUploadId:uploadId];
    } else {
        // more data to upload
        NSLog(@"Continuing upload...");
        [self.dbClient uploadFileChunk:uploadId offset:offset fromPath:localPath];
    }

}

- (void)restClient:(DBRestClient *)client uploadFileChunkFailedWithError:(NSError *)error {

    NSLog(@"uploadFileChunkFailedWithError: %@", error);
    // in real use, the app should probably implement some retrying logic here

}


- (void)restClient:(DBRestClient *)client uploadFileChunkProgress:(CGFloat)progress {

    NSLog(@"uploadFileChunkProgress: %f", progress);

}