使用PHP-CRUD-API上传文件至MySQL时触发数据完整性违规错误
解决PHP-CRUD-API上传图片到MediumBlob的"Data integrity violation"问题
我帮你梳理下问题所在,你遇到的这个错误大概率是数据格式不匹配或者请求头设置错误导致的,结合你提供的代码和PHP-CRUD-API的特性,咱们一步步修正:
核心问题分析
- 错误的请求头设置:当你用
FormData上传文件时,Angular的HttpClient会自动生成正确的multipart/form-data请求头(包含必要的boundary分隔符)。你手动添加Content-Type: application/json或者重复设置multipart/form-data会破坏这个自动逻辑,导致后端无法正确解析上传的文件数据。 - JSON无法传输二进制文件:直接用JSON格式传递
mapIcon对象是行不通的,因为JSON只能处理文本数据,无法直接携带二进制的File对象,后端接收到的file字段内容不符合MediumBlob的要求,自然触发数据完整性错误。
修正后的代码示例
1. Service层正确写法(仅用FormData,不手动设置请求头)
addMapIcon(mapIcon: mapIcon): Observable<string>{ let fd = new FormData(); // 注意:append文件时最好带上文件名,部分后端需要这个参数来识别文件 fd.append('file', mapIcon.file, mapIcon.file.name); fd.append('active', mapIcon.active ? '1' : '0'); fd.append('name', mapIcon.name); // 这里不需要手动设置headers!HttpClient会自动处理multipart请求头 return this.http.post<string>(this.iconApiUrl, fd); }
2. Component层简化处理(直接使用File对象,无需转DataURL)
onIconChange(e) { if(e.target.files && e.target.files.length) { const [file] = e.target.files; // 直接赋值原生File对象即可,FormData会自动处理二进制传输 this.mapIcon.file = file; this.mapIcon.name = file.name; this.mapIcon.active = true; } }
额外排查点
如果修正后还是报错,建议检查这几点:
- 数据库字段约束:确认你的表中除了
file、active、name外,没有其他非空必填字段未被传递,这也是触发"Data integrity violation"的常见原因。 - PHP-CRUD-API配置:确保API允许对该表的
file字段(MediumBlob类型)执行写入操作,没有权限或字段白名单限制。 - 请求验证:用浏览器开发者工具查看Network请求,确认:
- 请求头的
Content-Type是multipart/form-data; boundary=xxxxxx格式(由Angular自动生成) - FormData中确实包含了
file、active、name三个字段,且file的类型是File
- 请求头的
内容的提问来源于stack exchange,提问作者Nik Rubblers
相关产品推荐
相关产品推荐

