Я загрузил изображение с помощью almofire, и оно загружается по правильному пути, который мне нужен.
Однако мне нужно получить некоторые ответы, которые есть в моем бэкэнд-коде PHP, в мой быстрый, например filepath
.
Изображение, чтобы сделать мой вопрос более ясным и точным о том, что я хочу получить от .responseJSON
На изображении ниже мой ответ из кода PHP, я хочу получить значение пути к файлу в swift. Как я могу этого добиться?
Вот мой код:
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")
}
2 ответа
Затем просто расшифруйте свой ответ:
if let jsonResults = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
let filePath = jsonResults["filepath"] as? String // here is your value
}
JSONSerialization
, если при использовании .responseJSON
уже был вызов JSONSerialization
? Это делает двойную работу...
Значение блока 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.
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.
Value of type 'AFDataResponse<Any>' (aka 'DataResponse<Any, AFError>') has no member 'filepath'
resp
, в случае успеха вы можете указать значение как[String: Any]
и получить значение...