Angular通过FormData向PHP(MySQL)传参报错:数组转字符串转换
问题分析与解决方案
你遇到的核心问题是前端发送FormData的方式错误,导致后端无法正确解析文件上传请求,同时后端代码存在SQL注入风险,需要一并修正。
前端代码错误点
你现在把FormData嵌套在一个普通对象的image字段里发送,这种方式会让请求体变成JSON格式(而非文件上传需要的multipart/form-data),后端无法识别其中的文件内容,所以$_FILES["image"]为空,而$_POST["image"]会被解析成一个数组,这就是你看到Array to string conversion警告的原因。
修正后的前端代码
把所有参数(包括nom)都直接添加到同一个FormData对象中,然后直接发送这个FormData:
insertService(nom: string, fileToUpload: File): Promise<any> { const url = 'http://localhost/Admin/src/api/api.php?action=insertService'; const formData: FormData = new FormData(); formData.append('image', fileToUpload); formData.append('nom', nom); // 将nom也加入FormData console.log(formData); const request = this.http.post(url, formData); return request.toPromise(); }
注:Angular的
HttpClient会自动为FormData请求设置正确的Content-Type: multipart/form-data头,不需要手动设置。
后端PHP代码优化
修正前端后,后端可以正常获取$_POST['nom']和$_FILES['image'],同时需要优化代码:
- 增加文件上传的错误检查
- 用预处理语句避免SQL注入风险
- 确保目标目录存在,防止移动文件失败
修正后的PHP代码
// 先检查文件上传是否成功 if(isset($_FILES["image"]) && $_FILES["image"]["error"] === UPLOAD_ERR_OK) { $nom = $_POST['nom']; $filetmp = $_FILES["image"]["tmp_name"]; $filename = basename($_FILES["image"]["name"]); // 使用basename防止路径注入 $filepath = "../assets/img/" . $filename; // 检查目标目录是否存在,不存在则创建 $targetDir = dirname($filepath); if(!file_exists($targetDir)) { mkdir($targetDir, 0755, true); } // 移动上传的文件 if(move_uploaded_file($filetmp, $filepath)) { // 使用预处理语句执行SQL,避免注入 $query = 'INSERT INTO etservice(nom_service, image_ser) VALUES(?, ?)'; $stmt = $db->prepare($query); $stmt->bind_param("ss", $nom, $filepath); if($stmt->execute()) { $res = "Successfully inserted '$nom' and image '$filename'"; echo json_encode($res); } else { echo json_encode("Database error: " . $stmt->error); } $stmt->close(); } else { echo json_encode("Failed to move uploaded file to target directory"); } } else { $errorMsg = "No valid file uploaded"; if(isset($_FILES["image"]["error"]) && $_FILES["image"]["error"] !== UPLOAD_ERR_OK) { $errorMsg .= ", error code: " . $_FILES["image"]["error"]; } echo json_encode($errorMsg); }
为什么之前会报错
因为前端发送的是一个包含FormData的普通JSON对象,后端解析后$_POST['image']是这个嵌套结构的数组形式,当你尝试用echo输出它时,PHP会把数组转换成字符串Array,从而触发Array to string conversion的警告,同时$_FILES中没有image项,因为请求格式不符合文件上传的规范。
内容的提问来源于stack exchange,提问作者mohamed farjallah
相关产品推荐
相关产品推荐

