使用 PHP 在 Swift 5 中使用 Alamofire 接收图像上传
Posted
技术标签:
【中文标题】使用 PHP 在 Swift 5 中使用 Alamofire 接收图像上传【英文标题】:Receiving Image Upload in Swift 5 with Alamofire Using PHP 【发布时间】:2022-01-12 13:44:14 【问题描述】:我正在尝试使用 Alamofire 的多部分表单数据上传将图像从 ios 应用程序发送到使用 Swift 的服务器。我正在使用 php 接收数据,但它无法以某种方式工作。我在 *** 上查找了教程和其他问题,但没有一个在 Swift 5 中,我不确定是哪个部分导致了错误。
这是应用中的 Swift 代码:
let imageData = Image!.pngData()!
AF.upload(multipartFormData: multipartFormData in
multipartFormData.append(imageData, withName: "image", fileName: "test.png", mimeType: "image/png")
print("uploading image")
, to: url).responseJSON response in
debugPrint(response)
url正确,png数据不为空。这是 PHP 中的服务器端代码(灵感来自this *** question 的答案):
<?php
// If there is no image data
if (empty($_FILES["image"]))
$response = array("error" => "nodata");
// If there is data
else
$response['error'] = "NULL";
$filename = $_FILES["image"]["name"];
$path = "D:/emailback/images/" . $filename;
if (move_uploaded_file($_FILES['image']['tmp_name'], $path))
$response['status'] = "success";
$response['filename'] = "".$_FILES["file"]["name"];
$response['filepath'] = $path;
else
$response['status'] = "Failure";
$response['error'] = "".$_FILES["image"]["error"];
$response['name'] = "".$_FILES["image"]["name"];
$response['path'] = "".$path;
$response['type'] = "".$_FILES["image"]["type"];
$response['size'] = "".$_FILES["image"]["size"];
echo json_encode($response);
?>
但我在收到的回复中暗示$_FILES['image']['size']
为零。我不确定大小是什么意思。它也没有显示它是什么类型。 $_FILES['image']['tmp_name']
也是空的。这是我不断收到的回复:
[Result]: success(
error = 6;
name = "test.png";
path = "D:/emailback/images/test.png";
size = 0;
status = Failure;
type = "";
)
我不太确定这意味着什么以及如何解决问题。在此先感谢:)
【问题讨论】:
php.net/manual/en/features.file-upload.errors.php:UPLOAD_ERR_NO_TMP_DIR - Value: 6; Missing a temporary folder.
- 所以您的 PHP 似乎没有正确设置为接收任何文件上传。
@CBroe 我看到 Value: 6 意味着我缺少一个临时文件夹,但我不确定临时文件夹到底意味着什么,因为这是我第一次使用 PHP。有什么帮助吗?
在您的脚本开始之前,当 HTTP 请求被处理时,上传的文件将首先被放入一个临时目录。该临时目录的位置必须在 PHP 配置中指定,php.net/manual/en/ini.core.php#ini.upload-tmp-dir
谢谢!我试试看。
【参考方案1】:
我认为它们在您的 swift 和 PHP 代码中存在一些不匹配,例如您没有定义 get/post 方法、alamofire 调用中的 encodingCompletion 处理程序以及您试图获取“文件”的图像名称的 PHP 代码命名图像
$response['filename'] = "".$_FILES["file"]["name"];
但他们没有上传任何名为“文件”的文件。所以用下面的行替换这一行
$response['filename'] = "".$_FILES["image"]["name"];
要使用 Alamofire 使用 iOS 应用将图像发送到服务器,请尝试以下代码
Alamofire.upload(multipartFormData: multipartFormData in
multipartFormData.append(imageData, withName: "image", fileName: "test.png", mimeType: "image/png")
,to: url, method: .post, encodingCompletion: encodingResult in
switch encodingResult
case .success(let upload, _, _):
upload.responseJSON response in
print(response.result)
case .failure(let encodingError):
print(encodingError)
)
【讨论】:
我认为我的问题是我没有正确配置PHP。一旦我使用临时指令配置了 PHP,我的代码实际上就可以正常工作。还是谢谢。以上是关于使用 PHP 在 Swift 5 中使用 Alamofire 接收图像上传的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP 从 Swift 连接到在线数据库 (mySQL)。 (XCODE)
如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?