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
相关产品推荐
相关产品推荐

