Я загрузил изображение с помощью almofire, и оно загружается по правильному пути, который мне нужен.

Однако мне нужно получить некоторые ответы, которые есть в моем бэкэнд-коде PHP, в мой быстрый, например filepath.

Изображение, чтобы сделать мой вопрос более ясным и точным о том, что я хочу получить от .responseJSON

На изображении ниже мой ответ из кода PHP, я хочу получить значение пути к файлу в swift. Как я могу этого добиться?

enter image description here

Вот мой код:

PHP:

<?php

if (empty($_FILES["image"])) {
    $response = array("error" => "nodata");
}

else {
    $response['error'] = "NULL";
   
    $filename = uniqid() . ".jpg";
 
    if (move_uploaded_file($_FILES['image']['tmp_name'], "../propertyImages/" . $filename)) {
   
        $response['status'] = "success";
        $response['filepath'] = "https://example.com/WebService/propertyImages/" . $filename;
        $response['filename'] = "".$_FILES["file"]["name"];

} else{
   
    $response['status'] = "Failure";
    $response['error']  = "".$_FILES["image"]["error"];
    $response['name']   = "".$_FILES["image"]["name"]; 
    $response['path']   = "".$_FILES["image"]["tmp_name"];
    $response['type']   = "".$_FILES["image"]["type"];
    $response['size']   = "".$_FILES["image"]["size"];
  }
}

echo json_encode($response);
?>

Быстрый код:

 self.imageData = propImage.image!.jpegData(compressionQuality: 0.5)!
        
        let headers: HTTPHeaders = [
                    "Content-type": "multipart/form-data"
                ]

                    AF.upload(
                        multipartFormData: { multipartFormData in
                            multipartFormData.append(self.imageData!, withName: "image" , fileName: "file.jpg", mimeType: "image/jpeg")
                    },
                        to:"https://example.com/WebService/api/uploadPropImage.php", method: .post , headers: headers)
                        .responseJSON { resp in
                            //let responseString: String = String(data: self.imageData!, encoding: .utf8)!
                            print(resp) //this prints all the responses from the PHP code, my problem is how do i get a specific response, such as the filepath only and so on?
            }

РЕДАКТИРОВАТЬ:

Я пробовал некоторые из решений, это, похоже, будет работать, но все равно выдает ошибку чтения

"No exact matches in call to class method 'jsonObject'"

Обновленный код:

AF.upload(multipartFormData: { multipartFormData in                           multipartFormData.append(self.imageData!, withName: "image" , fileName: "file.jpg", mimeType: "image/jpeg")},                      to:"https://example.com/WebService/api/uploadPropImage.php", method: .post , headers: headers).responseJSON {
   result in
                        
 do{
   if let jsonResults = try JSONSerialization.jsonObject(with: result, options: []) as? [String: Any] { //error in this line
 let filePath = jsonResults["filepath"] as? String 
                            }
          }catch{
         print("ERROR")
     }
1
Derek 26 Янв 2022 в 12:30
Попробуйте распечатать (rep.filepath)
 – 
Aqib Javed
26 Янв 2022 в 12:34
Это то, что я получаю сообщение об ошибке Value of type 'AFDataResponse<Any>' (aka 'DataResponse<Any, AFError>') has no member 'filepath'
 – 
Derek
26 Янв 2022 в 12:35
И как я могу это сделать?
 – 
Derek
26 Янв 2022 в 12:40
Он уже расшифрован. Вам нужно использовать переключатель на resp, в случае успеха вы можете указать значение как [String: Any] и получить значение...
 – 
Larme
26 Янв 2022 в 12:41
Не могли бы вы дать подробный ответ/пример?
 – 
Derek
26 Янв 2022 в 12:43

2 ответа

Лучший ответ

Затем просто расшифруйте свой ответ:

if let jsonResults = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
    let filePath = jsonResults["filepath"] as? String // here is your value
}
0
AlexM 26 Янв 2022 в 14:54
Зачем использовать JSONSerialization, если при использовании .responseJSON уже был вызов JSONSerialization? Это делает двойную работу...
 – 
Larme
26 Янв 2022 в 16:40

Значение блока responseJSON равно Result. Это базовая концепция, которую часто используют, поэтому вам нужно научиться с ней обращаться. Обычной практикой является использование switch.

let headers: HTTPHeaders = ["Content-type": "multipart/form-data"]

AF.upload(multipartFormData: { multipartFormData in
    multipartFormData.append(self.imageData!, withName: "image" , fileName: "file.jpg", mimeType: "image/jpeg")
                             },
                              to:"https://example.com/WebService/api/uploadPropImage.php", method: .post , headers: headers)
   .responseJSON { result in
    switch result {
        case .success(let json):
            guard let dictionary = json as? [String: Any] else { print("Response JSON is not a dictionary"); return }
            guard let filePath = json["filePath"] as? String else { print("filePath key is not present in "\(json)" or is not a String");  return }
            print("Filepath: \(filePath)")
        case .failure(let error):
            print("Error: \(error)")
    }

}

Теперь может быть лучше использовать структуру Codable для анализа вашего ответа и вызова responseDecodable() вместо использования responseJSON(), который будет использовать JSONSerialization, метод, который, кстати, устарел. и будет удален в следующем основном выпуске Alamofire.

0
Larme 26 Янв 2022 в 15:02