如何利用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)

浙公网安备 33010602011771号