How to upload image that was taken from UIImagePickerController

After user choose image from the iPhone library with UIImagePickerController, I want to upload it to my server using ASIHTTPRequest library.

I know that with ASIHTTPRequest I can upload a file with the file’s URl, but how do I get the image URL?

  • Add additional button next to back button on Tab embedded in navigation controller
  • ios in-app subscriptions - when does original_transaction_id change?
  • My app is getting crashed on UIDocumentPickerViewController
  • EXC_BAD_ACCESS on custom UIView with custom XIB
  • Presenting semi-transparent viewcontroller that works both in iOS7 and iOS8
  • Can downloaded images/files be added to my app bundle?
  • I know I can get the image UIImagePickerControllerReferenceURL, that look like this:

    "assets-library://asset/asset.JPG?id=F2829B2E-6C6B-4569-932E-7DB03FBF7763&ext=JPG"
    

    is this the URL I need to use?

    6 Solutions Collect From Internet About “How to upload image that was taken from UIImagePickerController”

    Save the photo in Document directory and use that url to upload.For example

    NSString *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.jpg"];
    [UIImageJPEGRepresentation(img, 1.0) writeToFile:jpgPath atomically:YES];
    

    upload this image as [request setFile:jpgPath forKey:@"image"];

    There are two ways

    1:

    You can upload the image using the imagePickerController delegate

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{   
    
        UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
        //Upload your image
    }
    

    2:

    You can save the picked image url and upload later using this

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    
        NSString *imageUrl = [NSString stringWithFormat:@"%@",[info valueForKey:UIImagePickerControllerReferenceURL]];
        //Save the imageUrl
    }
    
    -(void)UploadTheImage:(NSString *)imageUrl{
    
     NSURL *url = [[NSURL alloc] initWithString:imageUrl];
     typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset);
     typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error);    
    
     ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset){
    
      ALAssetRepresentation *rep = [myasset defaultRepresentation];
      CGImageRef iref = [rep fullResolutionImage];
      UIImage *myImage = nil;   
    
      if (ref) {
          myImage = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:(UIImageOrientation)[rep orientation]];
    
            //upload the image   
         }      
      };      
    
      ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror){
    
      };          
    
    
      ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
     [assetslibrary assetForURL:url resultBlock:result block failureBlock:failureblock];    
    

    }

    Notes: Please make sure the scope of ALAssetsLibrary object while using ARC.Better to use the ALAssetsLibrary object as a singleton.

    To get the image UIImagePickerControllerReferenceUR. This Sample Code is given below

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    
        NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
        ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
        {
            ALAssetRepresentation *representation = [myasset defaultRepresentation];
            NSString *fileName = [representation filename];
            NSLog(@"fileName : %@",fileName);
    
            CGImageRef ref = [representation fullResolutionImage];
            ALAssetOrientation orientation = [[myasset valueForProperty:@"ALAssetPropertyOrientation"] intValue];
            UIImage *image = [UIImage imageWithCGImage:ref scale:1.0 orientation:(UIImageOrientation)orientation];
    
        };
    
        ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
        [assetslibrary assetForURL:imageURL 
                       resultBlock:resultblock
                      failureBlock:nil];
    
    }
    

    NOTE: It works only in iOS 5 and later.

    There are lots of answers that suggest UIImageJPEGRepresentation or UIImagePNGRepresentation. But these solutions will convert the original file while this question is actually about saving the file AS IS.

    It looks like uploading the file directly from assets library is impossible. But it can be accessed using PHImageManager to get the actual image data. Here’s how:

    Swift 3 (Xcode 8, only for iOS 8.0 and higher)

    1) Import the Photos framework

    import Photos
    

    2) In the imagePickerController(_:didFinishPickingMediaWithInfo:) get the asset URL

    3) Fetch assets using fetchAssets(withALAssetURLs:options:)

    4) Get the actual image data with requestImageData(for:options:resultHandler:). In the result handler of this method you will have the data as well as URL to the file (the URL can be accessed on Simulator, but unfortunately is not accessible on the device – in my tests startAccessingSecurityScopedResource() always returned false). However this URL is still useful to find out the file name.

    Example code:

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        dismiss(animated: true, completion: nil)
        if let assetURL = info[UIImagePickerControllerReferenceURL] as? URL,
            let asset = PHAsset.fetchAssets(withALAssetURLs: [assetURL], options: nil).firstObject,
            let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first,
            let targetURL = Foundation.URL(string: "file://\(documentsPath)") {
    
            PHImageManager.default().requestImageData(for: asset, options: nil, resultHandler: { (data, UTI, _, info) in
                if let imageURL = info?["PHImageFileURLKey"] as? URL,
                       imageData = data {
                        do {
                            try data.write(to: targetURL.appendingPathComponent(imageURL.lastPathComponent), options: .atomic)
    
                            self.proceedWithUploadFromPath(targetPath: targetURL.appendingPathComponent(imageURL.lastPathComponent))
    
                       } catch { print(error) }
                    }
                }
            })
        }
    }
    

    This will give you the file AS IS including its correct name and you can even get its UTI to determine correct mimetype (in addition to determining it via file extension) while preparing multipart body for upload.

    The easiest way I found is

    Step 1: Get path for DocumentsDirectory

    func fileInDocumentsDirectory(filename: String) -> String {
        let documentsFolderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] as NSString
        return documentsFolderPath.appendingPathComponent(filename)
    }
    

    Step 2: Save at the path with tempFileName

     func saveImage(image: UIImage, path: String ) {
        let pngImageData = UIImagePNGRepresentation(image)
    
        do {
            try pngImageData?.write(to: URL(fileURLWithPath: path), options: .atomic)
        } catch {
            print(error)
        }
    }
    

    Step 3: Usage in imagePickerController function

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
    
        if var image = info[UIImagePickerControllerOriginalImage] as? UIImage {// image asset
    
        self.saveImage(image: image, path: fileInDocumentsDirectory(filename: "temp_dummy_image.png"))
    
    }
    

    Step 4 : To get the image when required

    get the reference like this

    let localfilepath = self.fileInDocumentsDirectory(filename: “temp_dummy_image.png”)

    Step 5: After using the image, to trash the temp image

    func removeTempDummyImagefileInDocumentsDirectory(filename: String) {
    
        let fileManager = FileManager.default
        let documentsUrl =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
        let documentsPath = documentsUrl.path
    
        do {
            if let documentPath = documentsPath
            {
                let fileNames = try fileManager.contentsOfDirectory(atPath: "\(documentPath)")
                print("all files in cache: \(fileNames)")
                for fileName in fileNames {
    
                    if (fileName.hasSuffix(".png"))
                    {
                        let filePathName = "\(documentPath)/\(fileName)"
                        try fileManager.removeItem(atPath: filePathName)
                    }
                }
    
                let files = try fileManager.contentsOfDirectory(atPath: "\(documentPath)")
                print("all files in cache after deleting images: \(files)")
            }
    
        } catch {
            print("Could not clear temp folder: \(error)")
        }
    
    }
    

    you can upload image by creating form try below code

    -(void)UploadImage{
    
    NSString *urlString = @"yourUrl";
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"POST"];
    
    NSMutableData *body = [NSMutableData data];
    
    
    NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"];
    
    // file
    NSData *imageData = UIImageJPEGRepresentation([self scaleAndRotateImage:[selectedImageObj]],90);
    
    
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    // [body appendData:[[NSString stringWithString:@"Content-Disposition: attachment; name=\"user_photo\"; filename=\"photoes.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\"; filename=\"%@.jpg\"\r\n",@"ImageNmae"] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];
    [body appendData:[[NSString stringWithString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    
    
    // close form
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    // set request body
    [request setHTTPBody:body];
    //return and test
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
    
      }