How can you read a files MIME-type in objective-c

后端 未结 9 1597
伪装坚强ぢ
伪装坚强ぢ 2020-12-01 01:50

I am interested in detecting the MIME-type for a file in the documents directory of my iPhone application. A search through the docs did not provide any answers.

相关标签:
9条回答
  • 2020-12-01 02:55

    I'm not sure what are the practices on iPhone, but if you're allowed to, I'd make use of UNIX philosophy here: use program file, which is the standard way to detect filetype on an UNIX operating system. It includes a vast database of magic markers for filetype detection. Since file is probably not shipped on iPhone, you could include it in your app bundle. There might be a library implementing file's functionality.

    Alternatively, you could trust the browser. Browsers send the MIME type they guessed somewhere in the HTTP headers. I know that I can easily grab the MIME type information in PHP. That of course depends if you're willing to trust the client.

    0 讨论(0)
  • 2020-12-01 02:56

    Make sure are you import the coreservices

    import <CoreServices/CoreServices.h>

    in your file.

    0 讨论(0)
  • 2020-12-01 02:57

    Based on the Lawrence Dol/slf answer above, I have solved the NSURL loading the entire file into memory issue by chopping the first few bytes into a head-stub and getting the MIMEType of that. I have not benchmarked it, but it's probably faster this way too.

    + (NSString*) mimeTypeForFileAtPath: (NSString *) path {
        // NSURL will read the entire file and may exceed available memory if the file is large enough. Therefore, we will write the first fiew bytes of the file to a head-stub for NSURL to get the MIMEType from.
        NSFileHandle *readFileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
        NSData *fileHead = [readFileHandle readDataOfLength:100]; // we probably only need 2 bytes. we'll get the first 100 instead.
    
        NSString *tempPath = [NSHomeDirectory() stringByAppendingPathComponent: @"tmp/fileHead.tmp"];
    
        [[NSFileManager defaultManager] removeItemAtPath:tempPath error:nil]; // delete any existing version of fileHead.tmp
        if ([fileHead writeToFile:tempPath atomically:YES])
        {
            NSURL* fileUrl = [NSURL fileURLWithPath:path];
            NSURLRequest* fileUrlRequest = [[NSURLRequest alloc] initWithURL:fileUrl cachePolicy:NSURLCacheStorageNotAllowed timeoutInterval:.1];
    
            NSError* error = nil;
            NSURLResponse* response = nil;
            [NSURLConnection sendSynchronousRequest:fileUrlRequest returningResponse:&response error:&error];
            [[NSFileManager defaultManager] removeItemAtPath:tempPath error:nil];
            return [response MIMEType];
        }
        return nil;
    }
    
    0 讨论(0)
提交回复
热议问题