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.
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)")
}
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
}
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
}
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)
}