如何利用OSS实现大量数据导出

业务场景

在业务进行数据分析时,会经常碰到导出数据的场景,而对于数据量较大的导出,使用Excel的方式导出会比较消耗性能,而csv是纯文本文件,但可通过Excel等软件打开,OSS支持文本文件上传,这满足了我们导出数据的需求,所以我们可以使用OSS+csv的方式进行大数据量的文件导出

准备内容

1.已开通OSS服务
2.Mysql数据库
3. 下载OSS的SDK

操作步骤

  1. 分页从数据库获取数据
  2. 将数据上传至OSS
  3. 输出文件下载链接
    示例代码:
/**
* 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)

posted @   bilzzard  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示