如何利用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 @ 2024-01-23 17:39  bilzzard  阅读(182)  评论(0)    收藏  举报