• Thinkphp下载oss文件至本地压缩包


    实现原理:通过oss接口下载文件至服务器相关目录,然后进行压缩为一个zip文件,接口调用返回文件流或浏览器访问直接下载文件,下载完成后删除相关目录。

    一、ThinkPHP版本6.1

    二、PHP版本:8.0

    三、逻辑示例代码(根据应用场景更改,主要更改数据来源)

    1. /**
    2. * @notes 下载赛事作品
    3. * @return Json
    4. */
    5. public function downloadWork(): Json
    6. {
    7. try {
    8. // 设置作品下载或保存目录
    9. $loaclPath = public_path() . '/zip';
    10. // 目录不存在则进行创建
    11. if (!is_dir($loaclPath)) mkdir($loaclPath, 0777, true);
    12. // OSS数据内容,不包含bucket名称
    13. $list = ['1.png','2.png'];
    14. // 定义本地图片数组
    15. $img = [];
    16. foreach ($list as $k => $v) {
    17. // 获取oss文件地址,不包含bucket名称
    18. $object = str_replace('http://myykj-w.oss-cn-hangzhou.aliyuncs.com/', '', $val['down_load_url']);
    19. $filename = '/' . $key . '_文件';
    20. // 文件后缀
    21. $ext = substr($object, stripos($object, '.'));
    22. // 设置文件全名
    23. $fullPath = $loaclPath . $filename . $ext;
    24. $img[] = $fullPath;
    25. // 调用oss下载文件
    26. OssLogic::aliossDownload($object, $fullPath);
    27. }
    28. //这里需要注意该目录是否存在,并且有创建的权限
    29. $fileName = public_path() . '/image.zip';
    30. $zip = new \ZipArchive();
    31. $res = $zip->open($fileName, \ZipArchive::CREATE);
    32. if ($res === TRUE) {
    33. foreach ($img as $file) {
    34. //这里直接用原文件的名字进行打包,也可以直接命名,需要注意如果文件名字一样会导致后面文件覆盖前面的文件,所以建议重新命名
    35. $new_filename = substr($file, strrpos($file, '/') + 1);
    36. $zip->addFile($file, $new_filename);
    37. }
    38. }
    39. //关闭文件
    40. $zip->close();
    41. // 定义下载至本地的文件名称
    42. $downLoadName = '文件.zip';
    43. // 这里是下载zip文件
    44. header("Content-Type: application/zip");
    45. header("Content-Transfer-Encoding: Binary");
    46. header("Content-Length: " . filesize($fileName));
    47. header("Content-Disposition: attachment; filename=\"" . $downLoadName . "\"");
    48. readfile($fileName);
    49. unlink($fileName); // 删除压缩包
    50. deleteDirectory($loaclPath); // 删除文件目录及文件
    51. exit;
    52. } catch (\Exception $e) {
    53. return $this->fail($e->getMessage());
    54. }
    55. }

    四、oss下载示例代码(参数需要改为自己oss参数)

    1. /**
    2. * @notes oss下载
    3. * @return bool
    4. */
    5. public static function aliossDownload($object, $localfile): bool
    6. {
    7. // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    8. $accessKeyId = config('AccessKeyId');
    9. $accessKeySecret = config('AccessKeySecret');
    10. // Endpoint以杭州为例,其它Region请按实际情况填写。
    11. $endpoint = config('Endpoint');
    12. // 设置存储空间名称。
    13. $bucket = config('Bucket');
    14. //下载地址
    15. $options = array(
    16. OssClient::OSS_FILE_DOWNLOAD => $localfile
    17. );
    18. // 使用try catch捕获异常。如果捕获到异常,则说明下载失败;如果没有捕获到异常,则说明下载成功。
    19. try {
    20. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
    21. $ossClient->getObject($bucket, $object, $options);
    22. return true;
    23. } catch (OssException $e) {
    24. printf(__FUNCTION__ . ": FAILED\n");
    25. printf($e->getMessage() . "\n");
    26. return false;
    27. }
    28. }

    五、删除目录示例代码

    1. /**
    2. * @notes 递归删除文件夹
    3. * @return true
    4. */
    5. function deleteDirectory($dir): bool
    6. {
    7. if (!is_dir($dir)) {
    8. return false;
    9. }
    10. $files = array_diff(scandir($dir), array('.', '..'));
    11. foreach ($files as $file) {
    12. (is_dir("$dir/$file")) ? deleteDirectory("$dir/$file") : unlink("$dir/$file");
    13. }
    14. return rmdir($dir);
    15. }

  • 相关阅读:
    JAVA面试中的SSM框架基础面试题
    AIOT入门指南:探索人工智能与物联网的交汇点
    Android 四大组件 -- service
    在Windows上使用nginx具体步骤
    使用IDEA自带功能将WSDL转java
    基于 elementUI / elementUI plus,实现 主要色(主题色)的一件换色(换肤)
    Docker-基本了解
    如何将OFD文件转成WORD?每天免费用
    绘制函数堆栈
    学习笔记-算法-9-二叉树-1
  • 原文地址:https://blog.csdn.net/qq_38997379/article/details/134445418