如何利用OSS实现大量数据导出
业务场景
在业务进行数据分析时,会经常碰到导出数据的场景,而对于数据量较大的导出,使用Excel的方式导出会比较消耗性能,而csv是纯文本文件,但可通过Excel等软件打开,OSS支持文本文件上传,这满足了我们导出数据的需求,所以我们可以使用OSS+csv的方式进行大数据量的文件导出
准备内容
1.已开通OSS服务
2.Mysql数据库
3. 下载OSS的SDK
操作步骤
- 分页从数据库获取数据
- 将数据上传至OSS
- 输出文件下载链接
示例代码:
/** * Notes:生成csv文件 * @param array $content 文本内容 * @param string $fieldName 文件名 * @param int $position 位置 * @param array $header 表头 * @return array * @date: 2024-01-19 16:29:41 * @author:linyuhe */ public function uploadCsvFile(array $content, string $fieldName, int $position = 0, array $header = []): array { $accessKeyId = env('OSS_ACCESS_ID'); $accessKeySecret = env('OSS_ACCESS_SECRET'); $endpoint = env('OSS_ENDPOINT'); $bucket = env('OSS_BUCKET'); //存储路径 $path = 'uploads/' . date('Y') . "/". date('m') . "/" . date('d') . "/"; //文件名 $patName = $path . $fieldName; $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint); //判断是否需要添加表头 if ($position == 0) $content = array_merge([$header], $content); //将数组中的值用逗号隔开 foreach ($content as &$value) { $value = implode(',', $value); } //将数组中的值用换行符隔开 $content = implode("\n", $content) . "\n"; //防止乱码 if ($position == 0) $content = "\xEF\xBB\xBF" . $content; try { $position = $ossClient->appendObject($bucket, $patName, $content, $position); } catch (OssException $e) { $msg = $e->getMessage(); return errorReturn($msg); } return successReturn('生成成功', [ 'position' => $position, 'file_name' => $fieldName, 'path_name' => $patName, ]); }
因为使用Excel打开 csv 在不同系统打开会经常出现乱码的情况,比如 mac 上打开不乱码,但是在 windows 中打开就会出现乱码。这是因为在文件头缺少了 bom 头识别编码,打开时会按照系统默认的编码进行读取这时候就会出现乱码。所以我们在上传文件的起始位置要先插入UTF-8 bom 头( EF BB BF ),这样即可解决乱码问题。
缺点
csv文件\n(换行) ,逗号(,)不会在单元格换行,会新起一行这点很坑
参考文档:[https://developer.aliyun.com/article/994626](https://developer.aliyun.com/article/994626)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了