我正在尝试使用最新的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]
答案 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);
}