前端将Excel文件转Base64存入数据库后,Python后端解码报错的解决办法咨询
前端将Excel文件转Base64存入数据库后,Python后端解码报错的解决办法咨询
嘿,我来帮你排查这个问题~你遇到的这个Base64解码错误,根源其实出在前端传递的内容上。
问题原因
FileReader.readAsDataURL()方法返回的结果是完整的Data URL格式,它长这样:data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,xxxxxx...,其中前面的data:...;base64,是MIME类型前缀,并不是纯Base64编码内容。直接把这个完整字符串传给后端用base64.b64decode()解码,就会因为包含非Base64有效字符,导致字符总数不符合Base64的编码规则(必须是4的倍数,或差1-2个用=补全),从而抛出你看到的错误。
两种解决办法
你可以任选一种方式处理:
方式一:前端提前剥离前缀(更推荐)
在发送请求前,把Data URL的前缀去掉,只传递纯Base64内容:
const fileReader: FileReader = new FileReader(); fileReader.onloadend = (_x) => { // 分割Data URL,提取逗号后面的纯Base64部分 const base64Content = fileReader.result.split(',')[1]; const input: any = { name: file.name, content: { author: 'username', excelFile: base64Content, }, }; httprequest({params: input}).subscribe(); }; fileReader.readAsDataURL(file);
方式二:后端处理前缀(如果无法修改前端代码)
如果前端代码暂时不能调整,可以在后端解码前先去掉前缀:
data = api_client.get_file_details(id) excel_data = data["content"]["excelFile"] # 检查并去除Data URL前缀 if excel_data.startswith('data:'): excel_data = excel_data.split(',')[1] decoded_excel = base64.b64decode(excel_data) with open('example.xlsx', "wb") as f: f.write(decoded_excel)
这样处理后,后端拿到的就是纯Base64字符串,解码就能正常工作啦~
备注:内容来源于stack exchange,提问作者StaticName
相关产品推荐
相关产品推荐

