使用 Base64 字符串在 ToolJet 中上传并展示图片与 PDF 文件的完整指南
本指南讲解如何在 ToolJet 中利用 Base64 字符串完成文件的"上传—存储—回显"闭环:先通过 Filepicker 组件把图片与 PDF 读取为 Base64 编码写入 ToolJet Database(或其他数据库),再借助 Image 组件与 PDF 组件配合 Data URL 将数据库中的 Base64 数据渲染回界面。读完本文,你将掌握 Filepicker 暴露变量、ToolJet Database 的 Create Row / List rows 查询以及 Data URL 拼接这一整套可在真实业务中直接复用的文件存取方案。
1. 方案原理:为什么选择 Base64
浏览器无法直接把本地文件的二进制内容写入普通数据库字段,而 Base64 是一种把二进制数据编码为 ASCII 文本的通用方案,恰好可以安全地存入 varchar / text 类型的数据库列。ToolJet 的 Filepicker 组件在读取文件时会同时把内容加工成多种格式,其中就包括去除 Data URL 前缀后的纯 Base64 字符串。
从源码实现看,Filepicker 通过 FileReader 以两种方式读取文件(useFilePicker.js):
readAsText读取纯文本内容(存入content);readAsDataURL读取 Data URL,随后用readFileAsDataURLResult.split(',')[1]截取逗号之后的部分,得到base64Data。
const readFileAsDataURLResult = await getFileData(file, 'readAsDataURL');
const base64Data = readFileAsDataURLResult.split(',')[1];
最终每个文件对象会暴露 name、type、content、dataURL、base64Data、parsedData、filePath 等字段,并在画布上以 {{components.imagePicker.file[0].base64Data}} 这类暴露变量形式供查询和事件使用(对应文档见 file-picker.md)。这正是本方案中"上传"环节的数据来源。
2. 准备工作:在 ToolJet Database 中创建数据表
本指南以 ToolJet 内置的 ToolJet Database 为例(该原则同样适用于其他数据库,只要列类型能容纳长文本即可)。
- 进入 ToolJet 的数据库页面,新建一张表,命名为
testDB; - 数据表默认自带
id字段,用于为每条记录生成唯一标识; - 点击 Add more columns(添加更多列),追加两列:
pdf和image; - 将
pdf与image两列的数据类型都选择为varchar,用于存放 Base64 编码后的长字符串。
提示:Base64 编码会使数据体积比原始文件增大约 33%,若存储较大的文件,建议在数据库中为该列选用容量更大的文本类型(如
text),并在 Filepicker 中合理设置文件大小上限(默认为 51200000 字节,即约 48.8MB,见 useFilePicker.js)。
3. 上传环节:用 Filepicker 读取文件为 Base64
3.1 创建应用并放置两个 Filepicker
- 新建一个应用,命名为 Load PDF And Images Example;
- 从右侧组件库中拖入两个 Filepicker 组件;
- 将第一个 Filepicker 重命名为
imagePicker,第二个重命名为pdfPicker。
3.2 限制可接受的文件类型
Filepicker 的 Accept file types 属性决定了拖拽/选择弹窗中允许的文件类型,置空表示接受所有类型(见 file-picker.md)。
- 对
pdfPicker,将 Accept file types 设为{{"pdf/*"}},确保只能选择 PDF 文件;
- 对
imagePicker,保留默认的{{"image/*"}}设置,用于图片上传。
该属性最终会透传到 react-dropzone 的
accept配置(见 useFilePicker.js),如果上传了不符合类型的文件,会触发file-invalid-type校验错误并给出提示。
3.3 选择要上传的文件
分别点击两个 Filepicker 组件:imagePicker 中选择一张图片,pdfPicker 中选择一个 PDF 文件。上传成功后,组件上会显示对应文件名。
3.4 创建写入数据库的查询
- 点击查询面板中的 + Add 按钮新建查询;
- 数据源选择 ToolJet Database;
- Table name 选择
testDB,Operations 选择Create Row; - 将查询命名为
uploadFiles。
在 Columns 区域添加 pdf 和 image 两列,并填入以下表达式——这里直接引用了两个 Filepicker 的暴露变量,取数组中第一个文件的 base64Data:
pdf列:
{{components.pdfPicker.file[0].base64Data}}
image列:
{{components.imagePicker.file[0].base64Data}}
3.5 用按钮触发上传
- 在 Filepicker 下方添加一个 Button 组件,重命名为
upload,文本设为 Upload; - 为该按钮新建事件处理器(New event handler):Event 选择
On click,Action 选择Run Query,Query 选择uploadFiles。
点击 Upload 按钮后,两个 Filepicker 中当前选中文件的 Base64 字符串会被写入 testDB 表的新行。至此,上传流程完成。
4. 回显环节:从数据库读取并展示图片与 PDF
4.1 创建读取数据的查询
- 点击查询面板中的 + Add 按钮新建查询,命名为
getFiles; - 数据源选择 ToolJet Database,Table name 选择
testDB,Operations 选择List rows; - 勾选 Run this query on application load?(应用加载时自动运行),点击 Run 执行查询,确保界面初始化时即可拿到数据。
执行后,查询结果会保存在 queries.getFiles.data 中,data[0] 对应表中第一行记录,其 image 与 pdf 字段即之前写入的 Base64 字符串。
4.2 用 Image 组件展示图片
- 从组件库拖入一个 Image 组件,重命名为
displayImage; - 在其 URL 属性中填入:
{{'data:image;base64,' + queries.getFiles.data[0].image}}
这段表达式把 MIME 声明 data:image;base64, 与数据库中的 Base64 数据拼接成完整的 Data URL,浏览器即可直接渲染。这也是 Image 组件内部 data:${type};base64,${base64Data} 拼接逻辑(见 Image.jsx)的通用形式——事实上,Image 组件的 Image Format 属性若选择 base64 模式,本身就支持直接传入 {{data:...;base64,...}} 形式的 Data URL。
4.3 用 PDF 组件展示 PDF
- 从组件库拖入一个 PDF 组件,重命名为
displayPDF; - 在其 File URL 属性中填入:
{{'data:pdf;base64,' + queries.getFiles.data[0].pdf}}
PDF 组件底层基于 react-pdf(pdf.js)渲染(见 PDF.jsx),支持多页文档加载、页码导航、滚动定位、缩放等交互能力,Data URL 与普通 URL 一样可以作为其文档源。
4.4 最终效果
完成上述配置后,应用加载时会自动执行 getFiles 查询,displayImage 与 displayPDF 分别把数据库中存储的图片和 PDF 渲染出来,界面如下:
5. 进阶技巧与注意事项
5.1 使用查询响应转换(Transformation)拼接 MIME 前缀
如果不想在组件属性里拼接,也可以在查询的 Transformation 中对响应做预处理。例如在 getFiles 查询的转换函数中返回:
{
...data[0],
image: 'data:image/jpeg;base64,' + data[0].image,
pdf: 'data:application/pdf;base64,' + data[0].pdf,
}
之后组件属性可直接简写为:
{{queries.getFiles.data[0].image}}
5.2 多文件与多条记录的处理
- 本示例默认 Filepicker 单选(
enableMultiple为 false)。若开启多选,文件数组会包含多个元素,写入时需按需遍历,例如用{{components.pdfPicker.file.map(f => f.base64Data)}}配合支持数组存储的列或分多条记录写入; - 回显时
queries.getFiles.data[0]固定取第一行记录,实际场景中建议通过List rows的筛选条件(如按id或业务主键过滤)精确取到目标记录。
5.3 性能与数据量注意事项
- Base64 编码约使数据膨胀 33%,请结合数据库列类型(
varchar长度限制)评估可存储的文件大小; - Filepicker 默认最大文件大小为 51200000 字节(约 48.8MB)、默认最小文件大小为 0、默认文件数量上限为 2(见 useFilePicker.js),可在组件的验证(Validation)属性中调整;
- 如果图片渲染失败,可检查数据库中存的是否为纯 Base64(不含
data:前缀),因为组件属性拼接时已显式补充了data:image;base64,前缀。
6. 总结
通过上述四步(建表 → Filepicker 读取为 Base64 → Create Row 写入 → List rows 读取并以 Data URL 回显),即可在 ToolJet 中实现图片与 PDF 的完整存取闭环。核心要点可归纳为:
- 文件在浏览器端由 Filepicker 通过
FileReader.readAsDataURL读取,split(',')[1]提取纯 Base64(useFilePicker.js); - 数据库只需普通字符串列即可保存文件内容;
- 展示时通过
'data:<type>;base64,' + base64拼装 Data URL,交给 Image / PDF 组件渲染(Image.jsx); - 同一套逻辑可推广到其他文件类型(如 Word、CSV、音频等),只需对应调整 Accept file types 与 Data URL 的 MIME 前缀。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0631
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00








