Delphi FireDAC SQLite中Blob字段内容导出为本地文件的方法
Delphi 10.4.2 从SQLite Blob字段导出本地文件实现方案
实现前提
确保你已经完成以下前置操作:
fSQLite3Query已正常执行目标SELECT语句,且处于打开状态- 数据集中可以通过字段名
kSQLFieldMultimediaFileContents正常访问到存储的WAV二进制内容
核心实现代码
利用TBlobField内置的文件写入方法即可完成导出,不需要额外手动处理二进制流:
procedure SaveBlobToLocalFile(AQuery: TFDQuery; const ABlobFieldName: string; const AFullOutputPath: string); var TargetBlobField: TBlobField; begin // 基础合法性校验 if not Assigned(AQuery) then raise Exception.Create('传入的查询对象为空'); if not AQuery.Active then raise Exception.Create('数据集未处于打开状态,无法读取字段内容'); // 获取目标Blob字段 TargetBlobField := AQuery.FieldByName(ABlobFieldName) as TBlobField; // 空值判断,避免导出0字节空文件 if TargetBlobField.IsNull then raise Exception.Create('目标Blob字段无有效存储内容'); // 直接将字段内的二进制内容写入本地文件 TargetBlobField.SaveToFile(AFullOutputPath); end;
调用示例
对应你项目中已有的字段常量,直接传入参数即可完成导出:
// 将当前查询记录中的WAV内容保存到本地指定路径 SaveBlobToLocalFile( fSQLite3Query, kSQLFieldMultimediaFileContents, 'C:\LocalStorage\exported_audio.wav' );
常见注意事项
- 双向兼容性适配:该方法和你存入时使用的
ParamByName(...).LoadFromFile(..., ftBlob)是双向匹配的,不会对原始WAV二进制做额外编码、偏移处理,导出的文件可直接被通用媒体播放器识别 - 如果需要在导出前对Blob内容做自定义处理(比如内容校验、解密),可以先将Blob内容加载到内存流中操作,再手动写入文件,示例逻辑如下:
var TempStream: TMemoryStream; begin TempStream := TMemoryStream.Create; try // 从Blob字段加载内容到内存流 (fSQLite3Query.FieldByName(kSQLFieldMultimediaFileContents) as TBlobField) .SaveToStream(TempStream); // 此处可插入自定义流处理逻辑,比如校验WAV文件头、字节解密等 // 将处理后的流内容写入本地文件 TempStream.SaveToFile('C:\LocalStorage\processed_audio.wav'); finally TempStream.Free; end; end; - 大文件场景适配:针对大体积WAV文件,
SaveToFile方法会自动适配分块读写,不需要手动调整缓冲区大小,不会出现内存溢出问题
内容的提问来源于stack exchange,提问作者Mike at Bookup
相关产品推荐
相关产品推荐

