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

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'],同时需要优化代码:

  1. 增加文件上传的错误检查
  2. 用预处理语句避免SQL注入风险
  3. 确保目标目录存在,防止移动文件失败

修正后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:08:08