0

i am using AFNetworking 3.0.4 for a video file downloading and its progress reporting. The file seems to download successfully but when i save this file and try to get the file attributes then it gives me the following error.

Error Domain=NSCocoaErrorDomain Code=260 "The file “7598-Y2TKGNGSEG93SIT.mp4” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/919E2138-6327-4651-89A2-FCA951FDC128/Documents/video/7598-Y2TKGNGSEG93SIT.mp4, NSUnderlyingError=0x15e995970 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

I am using this line to get the file attributes.

 NSError *fileError;
      NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[filePath absoluteString] error:&fileError];

Here fileAttributes dictionary is nil and it gives me the above error in fileError variable.

Here is my full code

- (void)downloadFile:(MyObject *)myObj progress:(void (^)(float))progress success:(void (^)(NSString *filename))success failure:(void (^)())failure {


  NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
  AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

  NSURL *URL = [NSURL URLWithString: myObj.downloadUrl];
  NSURLRequest *request = [NSURLRequest requestWithURL:URL];

  NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
    NSLog(@"Completed : %f", downloadProgress.fractionCompleted);
    dispatch_async(dispatch_get_main_queue(), ^{
      [self progressBlocksForUrl: myObj.archiveUrl withProgress:downloadProgress.fractionCompleted];
    });
   } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
    NSLog(@"Destination");
    NSURL *url = [NSURL URLWithString:myObj.archiveUrl];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *videoPath = [NSString stringWithFormat:@"/%@/%@", @"video", [url lastPathComponent]];
    NSString *fullPath = [[paths firstObject] stringByAppendingPathComponent:videoPath];
    return  [NSURL URLWithString:fullPath];
   } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {


     NSHTTPURLResponse * myresponse = (NSHTTPURLResponse *)response;
     NSLog(@"Video downloaded, headers: %@", [myresponse.allHeaderFields description]);

    if(error) {
      NSLog(@"Error downloading video from %@: %@", myObj.archiveUrl, [error description]);
      [self failureBlockForUrl:myObj.archiveUrl];
    } else{

      NSError *fileError;
      NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[filePath absoluteString] error:&fileError];

      if (fileError) {
        NSLog(@"ERR: %@", [fileError description]);
        [self failureBlockForUrl:myObj.archiveUrl];
      } else {
        NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
        long long fileSize = [fileSizeNumber longLongValue];
        NSLog(@"File %@ with size %lld downloaded!", filePath, fileSize);
        [self completionBlocksForUrl:myObj.archiveUrl withFilename:[filePath absoluteString]];
      }
    }

  }];


  [downloadTask resume];
}

Can some body please guide me what i am doing wrong here. Any help will be highly appreciated. Thanks

Madu
  • 4,849
  • 9
  • 44
  • 78

1 Answers1

2

There are two kinds of urls.

file:///Users/xxx/Library/Developer/

/Users/xxx/Library/Developer/.

When you set a url for storing downloaded file, you should use the first one. When you retrieve it back from disk by NSFileManager, you should use the second one. So make the following changes.

return [NSURL fileURLWithPath:fullPath];

[[NSFileManager defaultManager] attributesOfItemAtPath:[filePath path] error:&fileError];

gabbler
  • 13,626
  • 4
  • 32
  • 44