使用 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 接收图像上传的主要内容,如果未能解决你的问题,请参考以下文章

这个块在 Swift - Alamofire 中是啥意思?

使用 PHP 从 Swift 连接到在线数据库 (mySQL)。 (XCODE)

如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?

使用 URLSession 将数据获取到 PHP 方法 - swift

在 Swift 5 中使用可达性 [重复]

在swift 5中将json数据获取到tableview