ホームページ PHPフレームワーク ThinkPHP Thinkphp6 が ZipArchive を使用してファイルをパッケージ化およびダウンロードする方法

Thinkphp6 が ZipArchive を使用してファイルをパッケージ化およびダウンロードする方法

Aug 22, 2020 pm 01:16 PM
php thinkphp6

以下は、thinkphp フレームワーク チュートリアルのコラムで、Thinkphp6 が ZipArchive を使用してファイルをパッケージ化してダウンロードする方法を紹介します。 !

  • 基本環境
    • システム環境: Windows10 x64
    • PHP統合環境: phpstudy
    • PHP依存関係管理ツール: Composer
    • マニュアル: Thinkphp

##(1) tp6 フレームワークをダウンロード

1

composer create-project topthink/think tp6

ログイン後にコピー

(2) パッケージダウンロードクラス

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

<?php

    namespace Jrk;

 

    class Zipdown

    {

       /**

        * 打包压缩文件及文件夹

        *

        * @Author Hhy <jackhhy520@qq.com>

        * @DateTime 2020-07-10 13:20:06

        * @param array $files

        * @param string $zipName 压缩包名称

        * @param boolean $wen

        * @param boolean $isDown

        * @return void

        */

       public function zip_file($files = [], $zipName = '', $wen = true,$isDown = true){

 

        $zip_file_path='zip/';

        // 文件名为空则生成文件名

        if (empty($zipName)) {

            $zipName = $zip_file_path.date('YmdHis') . '.zip';

        }else{

            $zipName=$zip_file_path.$zipName.'.zip';

        }

 

        // 实例化类,使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释

        $zip = new \ZipArchive;

        /*

        * 通过ZipArchive的对象处理zip文件

        * $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE

        * $zip->open这个方法第一个参数表示处理的zip文件名。

        * 这里重点说下第二个参数,它表示处理模式

        * ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。

        * ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效

        * */

        if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE) !== true) {

            exit('无法打开文件,或者文件创建失败');

        }

 

              // 文件夹打包处理

           if (is_string($files)) {

                // 文件夹整体打包

                $this->addFileToZip($files, $zip);

            } else {

                 // 文件打包

                foreach ($files as $val) {

                    if(file_exists(app()->getRootPath().'public'.$val['att_dir'])){

                        if($wen){

                            //根据存储的文件夹打包分层

                            $zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['img_dir'].'/'.$val['name']));

                        }else{

                            //不分层

                            $zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['name']));

                        }

                    }

                }

            }

            // 关闭

            $zip->close();

 

            // 验证文件是否存在

            if (!file_exists($zipName)) {

                exit("文件不存在");

            }

 

        if ($isDown) {

            // ob_clean();

             // 下载压缩包

             header("Cache-Control: public");

             header("Content-Description: File Transfer");

             header('Content-disposition: attachment; filename=' . basename($zipName)); //文件名

             header("Content-Type: application/zip"); //zip格式的

             header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件

             header('Content-Length: ' . filesize($zipName)); //告诉浏览器,文件大小

             @readfile($zipName);//ob_end_clean();

             @unlink(app()->getRootPath().'public/'.$zipName);//删除压缩包

 

         } else {

             // 直接返回压缩包地址

             return $zipName;

         }

       }

 

     /**

      * 添加文件至压缩包

      * @Author Hhy <jackhhy520@qq.com>

      * @DateTime 2020-07-10 13:20:26

      * @param [type] $path

      * @param [type] $zip

      * @return void

      */ 

     public function addFileToZip($path, $zip)

       {

           // 打开文件夹

           $handler = opendir($path);

           while (($filename = readdir($handler)) !== false) {

               if ($filename != "." && $filename != "..") {

                   // 编码转换

                   $filename = iconv('gb2312', 'utf-8', $filename);

                   // 文件夹文件名字为'.'和‘..’,不要对他们进行操作

                   if (is_dir($path . "/" . $filename)) {

                       // 如果读取的某个对象是文件夹,则递归

                       $this->addFileToZip($path . "/" . $filename, $zip);

                   } else {

                       // 将文件加入zip对象

                       $file_path = $path . "/" . $filename;

                       $zip->addFile($file_path, basename($file_path));

                   }

               }

           }

           // 关闭文件夹

           @closedir($path);

       }

 

       /**

        * 压缩文件解压

        *

        * @Author Hhy <jackhhy520@qq.com>

        * @DateTime 2020-07-10 13:23:11

        * @param [type] $file

        * @param [type] $dirname

        * @return void

        */

    public  function unzip_file($file, $dirname)

       {

           if (!file_exists($file)) {

               return false;

           }

           // zip实例化对象

           $zipArc = new \ZipArchive();

           // 打开文件

           if (!$zipArc->open($file)) {

               return false;

           }

           // 解压文件

           if (!$zipArc->extractTo($dirname)) {

               // 关闭

               $zipArc->close();

               return false;

           }

           return $zipArc->close();

       }

    }

ログイン後にコピー

(3) 使ってみて個人テストが効果的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

/**

    * @author: Hhy <jackhhy520@qq.com>

    * @date: 2020/7/2 0002

    * @describe:打包下载

    */

   public function download(){

     $id= $this->request->param("id");

       if (is_array($id)){

           $ids=$id;

       }else{

           $ids=@explode(",",$id);

       }

       $data=$this->model->where('id', 'in',$ids)->select()->toArray();

       //dd($data);

 

       if (empty($data)) {

           $this->error("暂无数据");

       }

       $zip=new Jrk\Zipdown();

       //打包下载

        $zip->zip_file($data);

   }

ログイン後にコピー

以上がThinkphp6 が ZipArchive を使用してファイルをパッケージ化およびダウンロードする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

CakePHP の日付と時刻

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

CakePHP ファイルのアップロード

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

CakePHP ルーティング

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

CakePHP プロジェクトの構成

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP について話し合う

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP クイックガイド

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法

See all articles