2016-07-14 1 views
1

J'ai essayé d'utiliser Alamofire et alamofireimage mais je n'arrive pas à obtenir la taille de fichier d'une image téléchargée de manière cohérente. Est-ce que j'utilise la mauvaise approche? car sûrement si Alamofire a téléchargé l'image, il saura quelle est la taille du fichier?AlamoFire: comment obtenir la taille de fichier de l'image téléchargée dans swift?

Voici l'exemple de code J'utilise

Alamofire.request(.GET, imageUrlToShow) 

     .responseImage { af_image in 
      debugPrint(af_image) 

      print(af_image.request) // Sometimes Content-Length is returned by other times not 

      if af_image.result.isFailure { 
       print("error") 
       completionhandler(imageInfo: nil, error: af_image.result.description) 
      } 
      if af_image.result.isSuccess { 

       if let serverResponse = af_image.response { 
       let serverHeaders = serverResponse.allHeaderFields 

        if let imageSize = serverHeaders["Content-Length"] as? String { 
print("we got an imagesize") 
} 

Répondre

0

Ceci est le dernier syntax correct pour la dernière version (2.4.0 AlamofireImage avec les dépendances de Alamofire 3.3):

import AlamofireImage 

var ext: String! = "jpeg" 

self.ext = "png" 
Alamofire.request(.GET, "https://httpbin.org/image/png") 
     .responseImage { response in 
      debugPrint(response) 

      print(response.request) 
      print(response.response) 
      debugPrint(response.result) 

      if let image = response.result.value { 
       print("image downloaded: \(image)") // example: background.png 
       var imgData: NSData! 
       switch self.ext { 
        case "png": 
         imgData = NSData(data: UIImagePNGRepresentation(image)!) 
        case "jpeg": 
         imgData = NSData(data: UIImageJPEGRepresentation((image), 1)!) 
        default: 
         break 
       } 
       if let data = imgData { 
        print("Size of Image: \(data.length) bytes") 
       } 
      } 
     } 

Vous pouvez utilisez également le framework général Alamofire, exactement cet exemple (téléchargez des fichiers ou reprenez un téléchargement déjà en cours).

Alamofire.download(.GET, "https://httpbin.org/stream/100") { temporaryURL, response in 
    let fileManager = NSFileManager.defaultManager() 
    let directoryURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] 
    let pathComponent = response.suggestedFilename 

    return directoryURL.URLByAppendingPathComponent(pathComponent!) 
} 

Alamofire.download(.GET, "https://httpbin.org/stream/100", destination: destination) 
     .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in 
      print(totalBytesRead) 

      // This closure is NOT called on the main queue for performance 
      // reasons. To update your ui, dispatch to the main queue. 
      dispatch_async(dispatch_get_main_queue()) { 
       print("Total bytes read on main queue: \(totalBytesRead)") 
      } 
     } 
     .response { _, _, _, error in 
      if let error = error { 
       print("Failed with error: \(error)") 
      } else { 
       print("Downloaded file successfully") 
      } 
     } 
+0

Merci, mais ce n'est pas que convertir le fichier en JPG et obtenir la taille du fichier à partir de cela. Cela ne va pas être le même que l'image originale. Et la conversion en JPG nuira à la qualité (JPG est l'équivalent d'un photocopieur ... les temps de déplacement que vous convertissez - plus la qualité est faible) –

+0

Vous pouvez utiliser UIImagePNGRepresentation et UIImageJPEGRepresentation dépendent de l'extension que vous voulez télécharger. –

+0

Oui - mais les deux font encore la conversion .. et crée de la complexité comme et comment puis-je faire face à des choses comme GIF ou webp? Je suis surpris de son assez complexe à télécharger un fichier à partir d'une URL - et obtenir la taille des octets? –

0

Vous pouvez utiliser .responseData() pour obtenir les données qui a été retourné, et obtenir la taille de cela. Malheureusement, la précision de Content-Length dépend du retour par le serveur des informations correctes. Comme vous l'avez vu, ce n'est pas toujours un indicateur précis et il n'est pas toujours inclus dans les réponses.

+0

.responseData n'existe pas dans AlamofireImage, vous avez peut-être l'intention d'utiliser le framework général Alamofire –

+0

Vous avez toutes les fonctionnalités d'Alamofire disponibles dans AFI. –

+0

Non, c'est faux, si vous téléchargez le framework Alamofire vous n'avez pas de responseImage dans votre manager. Vous devez télécharger AlamofireImage –