Как получить локальный URL фото из средства выбора изображений в Swift 4 - PullRequest
0 голосов
/ 25 января 2019

Я хочу выгрузить фотографию из галереи (iOS) на сервер (uploadUrl, получаемый с помощью .getWalluploadUrl в коде верен) от pod Alamofire (SessionManager) Я пытаюсь получить фотографию, выбирая ее с помощью ImagePicker. Но в загрузке Alamofire есть ошибка:

multipartEncodingFailed (причина: Alamofire.AFError. Ошибка домена = NSCocoaErrorDomain Code = 260 «Файл« asset.JPG »не может быть открыт, потому что такого файла нет.» UserInfo = {NSURL = файл: /// var / mobile / Containers / Data / Application / 366A5FD0- D597-44DC-A6C7-943DDEAB03B7 / Documents / asset.JPG, NSFilePath = / var / mobile / Containers / Data / Application / 366A5FD0-D597-44DC-A6C7-943DDEAB03B7 / Documents / asset.JPG, NSUnderlyingError = 0f0 0753 NSPOSIXErrorDomain Code = 2 "Нет такого файла или каталога"}}))

Почему этот файл не существует? Где я получил неправильный локальный путь с помощью imagePicker?

Код (я знаю, что этот код очень плох, но я просто хотел выяснить проблему с локальным путем):

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    let imageUrl          = info[UIImagePickerController.InfoKey.referenceURL] as! NSURL
    let imageName         = imageUrl.lastPathComponent
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    let photoURL          = NSURL(fileURLWithPath: documentDirectory)
    let localPath         = photoURL.appendingPathComponent(imageName!)
    let image             = info[UIImagePickerController.InfoKey.originalImage]as! UIImage
    let data              = image.pngData()

    self.getWalluploadUrl { (uploadUrl) in
        let sessionManager = SessionManager.default
        sessionManager.upload(
            multipartFormData: {
                data in
                data.append(
                    localPath!, //????? Incorrect path
                    withName: "file",
                    fileName: imageName!,
                    mimeType: "image/jpeg"
                )
        },
            to: uploadUrl,
            encodingCompletion: {
                (encodingResult) in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload
                        .uploadProgress { (progress) in
                            print("progress:",progress)
                        }
                        .responseJSON { response in
                            switch response.result {
                            case .success(let value):
                                let json = JSON(value)
                                print(json)
                            case .failure(let error):
                                print(error)
                            }

                    }
                case .failure(let error):
                    print(error)
                }
        }
        )

    }

1 Ответ

0 голосов
/ 29 января 2019

Я нашел правильный путь для Swift 4.2. Работает:

let photoLocalUrl = (info[UIImagePickerController.InfoKey.imageURL] as? URL)!

Не нужно использовать .path.lastPathComponent. Это уже полный и правильный локальный путь (как URL).

Примечание: URL-адреса всех фотографий (и для других файлов) являются временными, и при следующем запуске приложение будет другим.

...