Как получить имя файла в uiimagepickercontroller с библиотекой активов?
Я хочу получить имя файла из UIImagepickercontroller.Я не хочу использовать ALAssetLibrary, потому что он обезличен в iOS 9.Пожалуйста, скажите, как им пользоваться.Я использовал ниже код, но он возвращает мне imagename как Asset.jpg всегда для каждого файла.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let originalImage = (info[UIImagePickerControllerOriginalImage] as? UIImage)!
let url = info[UIImagePickerControllerReferenceURL] as! NSURL
imageData = UIImageJPEGRepresentation(originalImage, 100) as NSData?
let data = UploadData()
data.fileName = url.lastPathComponent
picker.dismiss(animated: true, completion: nil)
}
7 ответов:
Я предлагаю вам использовать
Photosфреймворк для получения имени изображения, ниже приведен код для получения имени выбранного изображенияfunc imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL { let result = PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil) let asset = result.firstObject print(asset?.value(forKey: "filename")) } dismiss(animated: true, completion: nil) }
Обновление 6 мая 2018
Принудительно развернутые опции иногда возвращают
nil, я думаю, это потому, что пользователь использует камеру для захвата нового изображения вместо выбора одного из библиотеки фотографий. Я обновил код, чтобы вернуть сгенерированное имя, когда увижу ноль.Оригинальный ответ
Это работает для меня без необходимости полагаться на
filenameключ (пожалуйста, извините за принудительное разворачивание optionals :) )extension MyViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { guard let image = info[UIImagePickerControllerEditedImage] as? UIImage else { DDLogDebug("No image chosen") return } if let url = info[UIImagePickerControllerReferenceURL] as? URL { let assets = PHAsset.fetchAssets(withALAssetURLs: [url], options: nil) if let firstAsset = assets.firstObject, let firstResource = PHAssetResource.assetResources(for: firstAsset).first { fileName = firstResource.originalFilename } else { fileName = generateNameForImage() } } else { fileName = generateNameForImage() } DDLogDebug("File name = \(fileName)") dismiss(animated: true) } func generateNameForImage() -> String { return "IMG_random_string" } }
До iOS 11
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL { let result = PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil) let assetResources = PHAssetResource.assetResources(for: result.firstObject!) print(assetResources.first!.originalFilename) } dismiss(animated: true, completion: nil) }После iOS 11
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset { let assetResources = PHAssetResource.assetResources(for: asset) print(assetResources.first!.originalFilename) } dismiss(animated: true, completion: nil) }
Делайте, как следует.
Я уверен, что это поможет вам.
Здесь мы сохраняем выбранное изображение в каталог документов, а затем пытаемся получить доступ к этому изображению из каталога документов.
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { let imageURL = info[UIImagePickerControllerReferenceURL] as NSURL let imageName = imageURL.path!.lastPathComponent let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as String let localPath = documentDirectory.stringByAppendingPathComponent(imageName) let image = info[UIImagePickerControllerOriginalImage] as UIImage let data = UIImagePNGRepresentation(image) data.writeToFile(localPath, atomically: true) let imageData = NSData(contentsOfFile: localPath)! let photoURL = NSURL(fileURLWithPath: localPath) let imageWithData = UIImage(data: imageData)! picker.dismissViewControllerAnimated(true, completion: nil) }
Импорт Фотографий
func getFileName(info: [String : Any]) -> String { if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL { let result = PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil) let asset = result.firstObject let fileName = asset?.value(forKey: "filename") let fileUrl = URL(string: fileName as! String) if let name = fileUrl?.deletingPathExtension().lastPathComponent { print(name) return name } } return "" }Вызовите его внутри метода "didFinishPickingMediaWithInfo" следующим образом:
let fileName = getFileName(info: info)
Вы можете попробовать это для iOS 11
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset { if let fileName = (asset.value(forKey: "filename")) as? String { //Do your stuff here } } picker.dismiss(animated: true, completion: nil) }Убедитесь, что вы добавили это описание NSPhotoLibraryUsageDescription в свой Infor.plist
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let asset = PHAsset.fetchAssets(withALAssetURLs: [info[UIImagePickerControllerReferenceURL] as! URL],options: nil).firstObject { var resources = PHAssetResource.assetResources(for: asset) let orgFilename: String = ((resources[0] as? PHAssetResource)?.originalFilename)! print("filename:",orgFilename) } }
Comments