You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4调用PHP API上传图片至服务器文件夹的技术咨询

Swift 4 上传图片到PHP API 完整实现

结合你已有的图片选择代码,我来一步步帮你实现把选中的图片上传到PHP API,并且让PHP把图片保存到服务器文件夹里。

一、Swift端:完善图片选择后的上传逻辑

你已经通过UIImagePickerController拿到了选中的图片,接下来需要把这个图片转换成可上传的二进制数据,然后通过URLSession发送multipart/form-data请求(这是上传文件的标准格式)。

1. 补充上传函数

先写一个专门处理上传的函数,你可以把它放在ViewController里:

func uploadImage(_ image: UIImage, fileName: String) {
    // 1. 把UIImage转成JPEG数据(也可以用PNG,JPEG体积更小)
    guard let imageData = image.jpegData(compressionQuality: 0.8) else {
        print("图片转数据失败")
        return
    }
    
    // 2. 设置API地址(替换成你的PHP接口URL)
    guard let url = URL(string: "http://你的服务器地址/upload.php") else {
        print("URL无效")
        return
    }
    
    // 3. 构造请求
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    
    // 4. 生成multipart/form-data的边界字符串(用来分隔不同字段)
    let boundary = "Boundary-\(UUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    
    // 5. 构造请求体
    var body = Data()
    
    // 添加图片字段("file"是PHP端要接收的字段名,可自定义)
    body.append("--\(boundary)\r\n".data(using: .utf8)!)
    body.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileName)\"\r\n".data(using: .utf8)!)
    body.append("Content-Type: image/jpeg\r\n\r\n".data(using: .utf8)!)
    body.append(imageData)
    body.append("\r\n".data(using: .utf8)!)
    
    // 结束边界
    body.append("--\(boundary)--\r\n".data(using: .utf8)!)
    
    request.httpBody = body
    
    // 6. 发送请求
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            print("上传出错: \(error.localizedDescription)")
            return
        }
        
        // 解析服务器响应
        if let data = data, let responseString = String(data: data, encoding: .utf8) {
            print("服务器响应: \(responseString)")
            // 这里可以根据PHP返回的结果做UI更新,比如提示用户上传成功
            DispatchQueue.main.async {
                // 更新UI的代码放在主线程
                self.dismiss(animated: true)
            }
        }
    }
    task.resume()
}

2. 在你的图片选择代理方法里调用上传函数

修改你已有的imagePickerController方法,拿到图片和文件名后调用上面的上传函数:

@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let pickerImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        // 获取图片原文件名(如果原文件名拿不到,也可以自己生成一个唯一文件名,比如用UUID)
        var fileName = "default_image.jpg"
        if let extURL = info[UIImagePickerControllerImageURL] as? NSURL {
            fileName = extURL.lastPathComponent ?? fileName
        }
        
        // 调用上传函数
        uploadImage(pickerImage, fileName: fileName)
    }
    
    // 关闭图片选择器
    picker.dismiss(animated: true)
}

二、PHP端:接收并保存图片

接下来写PHP接口upload.php,它负责接收Swift发送的图片,验证后保存到服务器的指定文件夹(比如uploads/):

<?php
// 设置允许的图片类型
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
// 设置保存目录(要确保这个目录存在且有写入权限)
$uploadDir = 'uploads/';

// 检查目录是否存在,不存在则创建
if (!file_exists($uploadDir)) {
    mkdir($uploadDir, 0755, true);
}

// 检查是否有文件上传
if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
    $file = $_FILES['file'];
    
    // 验证文件类型
    if (!in_array($file['type'], $allowedTypes)) {
        echo json_encode(['status' => 'error', 'message' => '只允许上传JPG/PNG/GIF图片']);
        exit;
    }
    
    // 生成保存的文件名(可以用原文件名,或者自定义唯一文件名避免覆盖)
    $fileName = basename($file['name']);
    // 或者用UUID生成唯一文件名:$fileName = uniqid() . '.' . pathinfo($file['name'], PATHINFO_EXTENSION);
    
    $savePath = $uploadDir . $fileName;
    
    // 移动临时文件到目标目录
    if (move_uploaded_file($file['tmp_name'], $savePath)) {
        echo json_encode(['status' => 'success', 'message' => '图片上传成功', 'file_path' => $savePath]);
    } else {
        echo json_encode(['status' => 'error', 'message' => '保存图片失败,请检查目录权限']);
    }
} else {
    $errorMsg = '没有上传文件或上传出错';
    if (isset($_FILES['file']['error']) && $_FILES['file']['error'] !== UPLOAD_ERR_OK) {
        $errorMsg = '上传错误码: ' . $_FILES['file']['error'];
    }
    echo json_encode(['status' => 'error', 'message' => $errorMsg]);
}
?>

三、关键注意事项

  • 服务器权限:确保PHP所在的服务器对uploads/目录有写入权限(通常设置为755或775)。
  • 图片大小限制:如果要上传大图片,需要修改PHP配置文件php.ini中的upload_max_filesize和post_max_size参数。
  • 文件名处理:如果担心原文件名重复或有特殊字符,建议用UUID生成唯一文件名,避免文件被覆盖。
  • 错误处理:Swift端要处理网络错误、图片转数据失败等情况;PHP端要验证文件类型、上传错误码等,返回清晰的错误信息方便调试。

内容的提问来源于stack exchange,提问作者Baljinder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:00:30