Vue.js上传图片存Oracle BLOB类型报ORA-01465错误求助
问题解决办法
ORA-01465: invalid hex number 属于Oracle数据库专属报错,触发原因是你尝试向BLOB类型字段插入的内容不是合法的二进制数据,问题完全出在后端数据处理逻辑,和前端上传逻辑无关。
前端优化(可选,简化冗余代码)
你之前做的「文件转dataURL再转Blob」是完全冗余的操作,直接上传原始文件即可,相关转换代码可以直接删除。同时axios提交FormData时不需要手动设置Content-Type请求头,框架会自动生成带boundary分隔符的正确请求头,手动设置反而可能导致解析失败。
修改后的前端提交代码示例:
async OnSubmit() { this.loading = true; const formData = new FormData(); formData.append('first_name', this.first_name); // 直接追加原始文件即可 formData.append('signature_1_1', this.$refs.file.files[0]); try{ let{data, status} = await axios.post('/api/auth/register', formData); this.loading = false; if ([201, 200].includes(status)) { Swal.fire({ title: "Success!", text: `Successfully Register RE Developer!`, icon: "success", allowOutsideClick: false, showCancelButton: false, confirmButtonText: "Close", }).then((result) => { this.$router.push({ name: "login" }); }); } } catch (error) { this.loading = false; Swal.fire({ title: "Oops!", text: `Something went wrong!`, icon: "error", allowOutsideClick: false, showCancelButton: false, confirmButtonText: "Close", }); } }
后端修改(核心修复)
- 验证层补全字段验证规则,同时读取上传文件的二进制内容再传入模型:
public static function validateTable(Request $request) { $validated = $request->validate([ 'first_name' => 'required|string', // 补全文件验证规则,可根据需求调整格式和大小限制 'signature_1_1' => 'required|file|mimes:png,jpg,jpeg|max:2048', ]); return [ 'first_name' => $validated['first_name'], // 关键:读取上传文件的二进制内容,适配Oracle BLOB字段 'signature_1_1' => $request->file('signature_1_1')->get(), ]; }
- 检查对应数据表的Model类,确保
signature_1_1已经加入$fillable属性,避免批量赋值时被过滤:
protected $fillable = [ 'first_name', 'signature_1_1', // 确保存在该行 // 其他允许批量赋值的字段 ];
内容的提问来源于stack exchange,提问作者Vincent Dapiton
相关产品推荐
相关产品推荐

