web-dev-qa-db-fra.com

Swift - Récupère la taille du fichier à partir de l'url

j'utilise documentPicker pour obtenir le chemin d'url de tout document, puis téléchargé dans la base de données. Je choisis un fichier (pdf, txt ..), le téléchargement fonctionne mais je veux limiter la taille du fichier.

 public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {

        self.file = url //url
        self.path = String(describing: self.file!) // url to string
        self.upload = true //set upload to true
        self.attachBtn.setImage(UIImage(named: "attachFilled"), for: .normal)//set image
        self.attachBtn.tintColor = UIColor.black //set color tint
        sendbtn.tintColor = UIColor.white //


        do
        {
            let fileDictionary = try FileManager.default.attributesOfItem(atPath: self.path!)
            let fileSize = fileDictionary[FileAttributeKey.size]
            print ("\(fileSize)")
        } 
        catch{
            print("Error: \(error)")
        }

    }

Je reçois le message d'erreur, ce fichier n'existe pas, où le sélecteur de documents enregistre-t-il le fichier et comment obtenir ses attributs.

18
yasser h

Tout d'abord, dans le système de fichiers, vous obtenez le chemin d'une URL avec la propriété path.

self.path = url.path

Mais vous n'en avez pas du tout besoin. Vous pouvez récupérer directement la taille du fichier à partir de l'URL:

self.path = String(describing: self.file!) // url to string

do {
    let resources = try url.resourceValues(forKeys:[.fileSizeKey])
    let fileSize = resources.fileSize!
    print ("\(fileSize)")
} catch {
    print("Error: \(error)")
}
26
vadian

Swift 4:

func sizePerMB(url: URL?) -> Double {
    guard let filePath = url?.path else {
        return 0.0
    }
    do {
        let attribute = try FileManager.default.attributesOfItem(atPath: filePath)
        if let size = attribute[FileAttributeKey.size] as? NSNumber {
            return size.doubleValue / 1000000.0
        }
    } catch {
        print("Error: \(error)")
    }
    return 0.0
}
15
Ahmed Lotfy

Swift 4.1 et 5

func fileSize(forURL url: Any) -> Double {
        var fileURL: URL?
        var fileSize: Double = 0.0
        if (url is URL) || (url is String)
        {
            if (url is URL) {
                fileURL = url as? URL
            }
            else {
                fileURL = URL(fileURLWithPath: url as! String)
            }
            var fileSizeValue = 0.0
            try? fileSizeValue = (fileURL?.resourceValues(forKeys: [URLResourceKey.fileSizeKey]).allValues.first?.value as! Double?)!
            if fileSizeValue > 0.0 {
                fileSize = (Double(fileSizeValue) / (1024 * 1024))
            }
        }
        return fileSize
    }
10
Gurjinder Singh

C'est très simple avec la dernière version de Swift pour calculer la taille du fichier à l'aide du formateur de compteur d'octets:

var fileSizeValue: UInt64 = 0

    do {

        let fileAttribute: [FileAttributeKey : Any] = try FileManager.default.attributesOfItem(atPath: url.path)

        if let fileNumberSize: NSNumber = fileAttribute[FileAttributeKey.size] as? NSNumber {
            fileSizeValue = UInt64(fileNumberSize)

            let byteCountFormatter: ByteCountFormatter = ByteCountFormatter()
            byteCountFormatter.countStyle = ByteCountFormatter.CountStyle.file

            byteCountFormatter.allowedUnits = ByteCountFormatter.Units.useBytes
            print(byteCountFormatter.string(fromByteCount: Int64(fileSizeValue)))

            byteCountFormatter.allowedUnits = ByteCountFormatter.Units.useKB
            print(byteCountFormatter.string(fromByteCount: Int64(fileSizeValue)))

            byteCountFormatter.allowedUnits = ByteCountFormatter.Units.useMB
            print(byteCountFormatter.string(fromByteCount: Int64(fileSizeValue)))

        }

    } catch {
        print(error.localizedDescription)
    }
5
sinner