一、上传原理与配置

1.1 原理

将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可。

1.2 客户端配置

所需:表单页面(选择上传文件);

具体而言:发送方式为POST,添加enctype="multipart/form-data"属性,两者缺一不可(但是,优缺点并存,这里也限定了上传的方式和上传的文件之后的调用等方面,后面会说到

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<form action="doAction.php" method="post" enctype="multipart/form-data">

请选择您要上传的文件:

<input type="file" name="myFile" /><br/>

<input type="submit" value="上传"/>

</form>

<?php

?>

</body>

</html>

先是表单页面(请自动忽略前端问题。。。),关键就是form的属性;另外就是input 中用到了type="file"这一点(体现到php的强大的拓展等等)。

然后是doAction.php

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

<?php

//$_FILES:文件上传变量

//print_r($_FILES);

$filename=$_FILES['myFile']['name'];

$type=$_FILES['myFile']['type'];

$tmp_name=$_FILES['myFile']['tmp_name'];

$size=$_FILES['myFile']['size'];

$error=$_FILES['myFile']['error'];

//将服务器上的临时文件移动到指定位置

//方法一move_upload_file($tmp_name,$destination)

//move_uploaded_file($tmp_name, "uploads/".$filename);//文件夹应提前建立好,不然报错

//方法二copy($src,$des)

//以上两个函数都是成功返回真,否则返回false

//copy($tmp_name, "copies/".$filename);

//注意,不能两个方法都对临时文件进行操作,临时文件似乎操作完就没了,我们试试反过来

copy($tmp_name, "copies/".$filename);

move_uploaded_file($tmp_name, "uploads/".$filename);

//能够实现,说明move那个函数基本上相当于剪切;copy就是copy,临时文件还在

//另外,错误信息也是不一样的,遇到错误可以查看或者直接报告给用户

if ($error==0) {

    echo "上传成功!";

}else{

    switch ($error){

        case 1:

            echo "超过了上传文件的最大值,请上传2M以下文件";

            break;

        case 2:

            echo "上传文件过多,请一次上传20个及以下文件!";

            break;

        case 3:

            echo "文件并未完全上传,请再次尝试!";

            break;

        case 4:

            echo "未选择上传文件!";

            break;

        case 5:

            echo "上传文件为0";

            break;

    }

}

先把print_r($_FILES)这个信息看一下

1

2

3

4

5

6

7

8

9

10

11

12

Array

(

    [myFile] => Array

        (

            [name] => 梁博_简历.doc

            [type] => application/msword

            [tmp_name] => D:\wamp\tmp\php1D78.tmp

            [error] => 0

            [size] => 75776

        )

)

所以得到的是个二维数组,该怎么用,都是基本的东西(其实我喜欢降维再用);

基本是一眼就懂的东西,不罗嗦,关键有两个:tmp_name临时文件名;error报错信息(代号,后面可以利用);

然后这里看一下doAction后面一部分,利用报错信息来反馈给用户,需要说明的是为什么报错,和报错信息是什么都

1.3 关于报错

--报错原因

基本上都是超过或者不符合服务器关于上传文件的配置,那么服务器端配置有哪些呢?

先考虑上传我们用了什么?POST,upload

所以在php.ini中找这么几项:

file_upload:On

upload_tmp_dir=——临时文件保存目录;

upload_max_filesize=2M

max_file_uploads=20——允许一次上传的最大文件数量(注意和上面那个的区别,有没有size,别乱想)

post_max_size=8M——post方式发送数据的最大值

其他相关配置

max_exectuion_time=-1——最大执行时间,避免程序不好占用服务器资源;

max_input_time=60

max_input_nesting_level=64——输入嵌套深度;

memory_limit=128M——最大单线程的独立内存使用量

总之都是有关资源的配置。

--错误号

UPLOAD_ERR_OK 值:0; 没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE 值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE 值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL 值:3; 文件只有部分被上传。
UPLOAD_ERR_NO_FILE 值:4; 没有文件被上传。

注意:这个错误信息是第一步上传的信息,也就是上传到临时文件夹的情况,而不是move或者copy的情况。

二、上传相关限制

2.1 客户端限制

1

2

3

4

5

6

<form action="doAction2.php" method="post" enctype="multipart/form-data">

<input type="hidden" name="MAX_FILE_SIZE" value="101321" />

请选择您要上传的文件:

<input type="file" name="myFile" accept="image/jpeg,image/gif,text/html"/><br/>

<input type="submit" value="上传"/>

</form>

这里用input的属性对上传文件的大小和类型进行了限制,但是个人感觉:一,html代码是“可见的”;二,常不起作用(没找到原因,但因为第一个我也想放弃它,知道就好。

2.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

<?php

header('content-type:text/html;charset=utf-8');

//接受文件,临时文件信息

$fileinfo=$_FILES["myFile"];//降维操作

$filename=$fileinfo["name"];

$tmp_name=$fileinfo["tmp_name"];

$size=$fileinfo["size"];

$error=$fileinfo["error"];

$type=$fileinfo["type"];

//服务器端设定限制

$maxsize=10485760;//10M,10*1024*1024

$allowExt=array('jpeg','jpg','png','gif');//允许上传的文件类型(拓展名

$ext=pathinfo($filename,PATHINFO_EXTENSION);//提取上传文件的拓展名

//目的信息

$path="uploads";

if (!file_exists($path)) {   //当目录不存在,就创建目录

    mkdir($path,0777,true);

    chmod($path, 0777);

}

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

//得到唯一的文件名!防止因为文件名相同而产生覆盖

$uniName=md5(uniqid(microtime(true),true)).$ext;//md5加密,uniqid产生唯一id,microtime做前缀

if ($error==0) {

    if ($size>$maxsize) {

        exit("上传文件过大!");

    }

    if (!in_array($ext, $allowExt)) {

        exit("非法文件类型");

    }

    if (!is_uploaded_file($tmp_name)) {

        exit("上传方式有误,请使用post方式");

    }

    if (@move_uploaded_file($tmp_name, $uniName)) {//@错误抑制符,不让用户看到警告

        echo "文件".$filename."上传成功!";

    }else{

        echo "文件".$filename."上传失败!";

    }

    //判断是否为真实图片(防止伪装成图片的病毒一类的

    if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false

        exit("不是真正的图片类型");

    }

}else{

    switch ($error){

        case 1:

            echo "超过了上传文件的最大值,请上传2M以下文件";

            break;

        case 2:

            echo "上传文件过多,请一次上传20个及以下文件!";

            break;

        case 3:

            echo "文件并未完全上传,请再次尝试!";

            break;

        case 4:

            echo "未选择上传文件!";

            break;

        case 7:

            echo "没有临时文件夹";

            break;

    }

}

2.3 封装

函数

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

<?php

function uploadFile($fileInfo,$path,$allowExt,$maxSize){

$filename=$fileInfo["name"];

$tmp_name=$fileInfo["tmp_name"];

$size=$fileInfo["size"];

$error=$fileInfo["error"];

$type=$fileInfo["type"];

//服务器端设定限制

$ext=pathinfo($filename,PATHINFO_EXTENSION);

//目的信息

if (!file_exists($path)) {  

    mkdir($path,0777,true);

    chmod($path, 0777);

}

$uniName=md5(uniqid(microtime(true),true)).'.'.$ext;

$destination=$path."/".$uniName;

if ($error==0) {

    if ($size>$maxSize) {

        exit("上传文件过大!");

    }

    if (!in_array($ext, $allowExt)) {

        exit("非法文件类型");

    }

    if (!is_uploaded_file($tmp_name)) {

        exit("上传方式有误,请使用post方式");

    }

    //判断是否为真实图片(防止伪装成图片的病毒一类的

    if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false

        exit("不是真正的图片类型");

    }

    if (@move_uploaded_file($tmp_name, $destination)) {//@错误抑制符,不让用户看到警告

        echo "文件".$filename."上传成功!";

    }else{

        echo "文件".$filename."上传失败!";

    }

    

}else{

    switch ($error){

        case 1:

            echo "超过了上传文件的最大值,请上传2M以下文件";

            break;

        case 2:

            echo "上传文件过多,请一次上传20个及以下文件!";

            break;

        case 3:

            echo "文件并未完全上传,请再次尝试!";

            break;

        case 4:

            echo "未选择上传文件!";

            break;

        case 7:

            echo "没有临时文件夹";

            break;

    }

}

return $destination;

}

调用

1

2

3

4

5

6

7

8

<?php

header('content-type:text/html;charset=utf-8');

$fileInfo=$_FILES["myFile"];

$maxSize=10485760;//10M,10*1024*1024

$allowExt=array('jpeg','jpg','png','tif');

$path="uploads";

include_once 'upFunc.php';

uploadFile($fileInfo, $path, $allowExt, $maxSize);

三、多文件的上传实现

3.1 利用单文件封装

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<form action="doAction5.php" method="post" enctype="multipart/form-data">

请选择您要上传的文件:<input type="file" name="myFile1" /><br/>

请选择您要上传的文件:<input type="file" name="myFile2" /><br/>

请选择您要上传的文件:<input type="file" name="myFile3" /><br/>

请选择您要上传的文件:<input type="file" name="myFile4" /><br/>

<input type="submit" value="上传"/>

</form>

</body>

</html>

1

2

3

4

5

6

7

<?php

//print_r($_FILES);

header('content-type:text/html;charset=utf-8');

include_once 'upFunc.php';

foreach ($_FILES as $fileInfo){

    $file[]=uploadFile($fileInfo);

}

这里的思路,从print_r($_FILES)中去找,打印出来看到是个二维数组,很简单,遍历去用就好了!

上面那个function的定义改一下,给定一些默认值

1

function uploadFile($fileInfo,$path="uploads",$allowExt=array('jpeg','jpg','png','tif'),$maxSize=10485760){

这样子,简单是简单,但遇到一些问题。

正常的上传4个图片是没问题,但要是中间激活了函数中的exit,就会立即停止,导致其他图片也无法上传。

3.2升级版封装

旨在实现针对多个或单个文件上传的封装

首先这样子写个静态文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<form action="doAction5.php" method="post" enctype="multipart/form-data">

请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>

请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>

请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>

请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>

<input type="submit" value="上传"/>

</form>

</body>

</html>

打印一下$_FILES

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

Array

(

    [myFile] => Array

        (

            [name] => Array

                (

                    [0] => test32.png

                    [1] => test32.png

                    [2] => 333.png

                    [3] => test41.png

                )

            [type] => Array

                (

                    [0] => image/png

                    [1] => image/png

                    [2] => image/png

                    [3] => image/png

                )

            [tmp_name] => Array

                (

                    [0] => D:\wamp\tmp\php831C.tmp

                    [1] => D:\wamp\tmp\php834C.tmp

                    [2] => D:\wamp\tmp\php837C.tmp

                    [3] => D:\wamp\tmp\php83BB.tmp

                )

            [error] => Array

                (

                    [0] => 0

                    [1] => 0

                    [2] => 0

                    [3] => 0

                )

            [size] => Array

                (

                    [0] => 46174

                    [1] => 46174

                    [2] => 34196

                    [3] => 38514

                )

        )

)

可以得到一个三维数组。

复杂是复杂了,但复杂的有规律,各项数值都在一起了,很方便我们取值!!

所以先得到文件信息,变成单文件处理那种信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

function getFiles(){

    $i=0;

    foreach($_FILES as $file){

        if(is_string($file['name'])){  //单文件判定

            $files[$i]=$file;

            $i++;

        }elseif(is_array($file['name'])){

            foreach($file['name'] as $key=>$val){  //我的天,这个$key用的diao

                $files[$i]['name']=$file['name'][$key];

                $files[$i]['type']=$file['type'][$key];

                $files[$i]['tmp_name']=$file['tmp_name'][$key];

                $files[$i]['error']=$file['error'][$key];

                $files[$i]['size']=$file['size'][$key];

                $i++;

            }

        }

    }

    return $files;

    

}

然后之前的那种exit错误,就把exit改一下就好了,这里用res

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

function uploadFile($fileInfo,$path='./uploads',$flag=true,$maxSize=1048576,$allowExt=array('jpeg','jpg','png','gif')){

    //$flag=true;

    //$allowExt=array('jpeg','jpg','gif','png');

    //$maxSize=1048576;//1M

    //判断错误号

    $res=array();

    if($fileInfo['error']===UPLOAD_ERR_OK){

        //检测上传得到小

        if($fileInfo['size']>$maxSize){

            $res['mes']=$fileInfo['name'].'上传文件过大';

        }

        $ext=getExt($fileInfo['name']);

        //检测上传文件的文件类型

        if(!in_array($ext,$allowExt)){

            $res['mes']=$fileInfo['name'].'非法文件类型';

        }

        //检测是否是真实的图片类型

        if($flag){

            if(!getimagesize($fileInfo['tmp_name'])){

                $res['mes']=$fileInfo['name'].'不是真实图片类型';

            }

        }

        //检测文件是否是通过HTTP POST上传上来的

        if(!is_uploaded_file($fileInfo['tmp_name'])){

            $res['mes']=$fileInfo['name'].'文件不是通过HTTP POST方式上传上来的';

        }

        if($res) return $res;

        //$path='./uploads';

        if(!file_exists($path)){

            mkdir($path,0777,true);

            chmod($path,0777);

        }

        $uniName=getUniName();

        $destination=$path.'/'.$uniName.'.'.$ext;

        if(!move_uploaded_file($fileInfo['tmp_name'],$destination)){

            $res['mes']=$fileInfo['name'].'文件移动失败';

        }

        $res['mes']=$fileInfo['name'].'上传成功';

        $res['dest']=$destination;

        return $res;

        

    }else{

        //匹配错误信息

        switch ($fileInfo ['error']) {

            case 1 :

                $res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';

                break;

            case 2 :

                $res['mes'] = '超过了表单MAX_FILE_SIZE限制的大小';

                break;

            case 3 :

                $res['mes'] = '文件部分被上传';

                break;

            case 4 :

                $res['mes'] = '没有选择上传文件';

                break;

            case 6 :

                $res['mes'] = '没有找到临时目录';

                break;

            case 7 :

            case 8 :

                $res['mes'] = '系统错误';

                break;

        }

        return $res;

    }

}

里面封装两个小的

1

2

3

4

5

6

7

8

9

10

11

function getExt($filename){

    return strtolower(pathinfo($filename,PATHINFO_EXTENSION));

}

/**

 * 产生唯一字符串

 * @return string

 */

function getUniName(){

    return md5(uniqid(microtime(true),true));

}

然后在静态中,使用multiple属性实现多个文件的输入

1

2

3

4

5

6

7

8

9

10

11

12

13

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<form action="doAction6.php" method="POST" enctype="multipart/form-data">

请选择您要上传的文件:<input type="file" name="myFile[]" multiple='multiple' /><br/>

<input type="submit" value="上传"/>

</form>

</body>

</html>

doAction6.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

//print_r($_FILES);

header("content-type:text/html;charset=utf-8");

require_once 'upFunc2.php';

require_once 'common.func.php';

$files=getFiles();

// print_r($files);

foreach($files as $fileInfo){

    $res=uploadFile($fileInfo);

    echo $res['mes'],'<br/>';

    $uploadFiles[]=@$res['dest'];

}

$uploadFiles=array_values(array_filter($uploadFiles));

//print_r($uploadFiles);

四、面向对象的文件上传

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

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

<?php

class upload{

    protected $fileName;

    protected $maxSize;

    protected $allowMime;

    protected $allowExt;

    protected $uploadPath;

    protected $imgFlag;

    protected $fileInfo;

    protected $error;

    protected $ext;

    /**

     * @param string $fileName

     * @param string $uploadPath

     * @param string $imgFlag

     * @param number $maxSize

     * @param array $allowExt

     * @param array $allowMime

     */

    public function __construct($fileName='myFile',$uploadPath='./uploads',$imgFlag=true,$maxSize=5242880,$allowExt=array('jpeg','jpg','png','gif'),$allowMime=array('image/jpeg','image/png','image/gif')){

        $this->fileName=$fileName;

        $this->maxSize=$maxSize;

        $this->allowMime=$allowMime;

        $this->allowExt=$allowExt;

        $this->uploadPath=$uploadPath;

        $this->imgFlag=$imgFlag;

        $this->fileInfo=$_FILES[$this->fileName];

    }

    /**

     * 检测上传文件是否出错

     * @return boolean

     */

    protected function checkError(){

        if(!is_null($this->fileInfo)){

            if($this->fileInfo['error']>0){

                switch($this->fileInfo['error']){

                    case 1:

                        $this->error='超过了PHP配置文件中upload_max_filesize选项的值';

                        break;

                    case 2:

                        $this->error='超过了表单中MAX_FILE_SIZE设置的值';

                        break;

                    case 3:

                        $this->error='文件部分被上传';

                        break;

                    case 4:

                        $this->error='没有选择上传文件';

                        break;

                    case 6:

                        $this->error='没有找到临时目录';

                        break;

                    case 7:

                        $this->error='文件不可写';

                        break;

                    case 8:

                        $this->error='由于PHP的扩展程序中断文件上传';

                        break;

                        

                }

                return false;

            }else{

                return true;

            }

        }else{

            $this->error='文件上传出错';

            return false;

        }

    }

    /**

     * 检测上传文件的大小

     * @return boolean

     */

    protected function checkSize(){

        if($this->fileInfo['size']>$this->maxSize){

            $this->error='上传文件过大';

            return false;

        }

        return true;

    }

    /**

     * 检测扩展名

     * @return boolean

     */

    protected function checkExt(){

        $this->ext=strtolower(pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION));

        if(!in_array($this->ext,$this->allowExt)){

            $this->error='不允许的扩展名';

            return false;

        }

        return true;

    }

    /**

     * 检测文件的类型

     * @return boolean

     */

    protected function checkMime(){

        if(!in_array($this->fileInfo['type'],$this->allowMime)){

            $this->error='不允许的文件类型';

            return false;

        }

        return true;

    }

    /**

     * 检测是否是真实图片

     * @return boolean

     */

    protected function checkTrueImg(){

        if($this->imgFlag){

            if(!@getimagesize($this->fileInfo['tmp_name'])){

                $this->error='不是真实图片';

                return false;

            }

            return true;

        }

    }

    /**

     * 检测是否通过HTTP POST方式上传上来的

     * @return boolean

     */

    protected function checkHTTPPost(){

        if(!is_uploaded_file($this->fileInfo['tmp_name'])){

            $this->error='文件不是通过HTTP POST方式上传上来的';

            return false;

        }

        return true;

    }

    /**

     *显示错误

     */

    protected function showError(){

        exit('<span style="color:red">'.$this->error.'</span>');

    }

    /**

     * 检测目录不存在则创建

     */

    protected function checkUploadPath(){

        if(!file_exists($this->uploadPath)){

            mkdir($this->uploadPath,0777,true);

        }

    }

    /**

     * 产生唯一字符串

     * @return string

     */

    protected function getUniName(){

        return md5(uniqid(microtime(true),true));

    }

    /**

     * 上传文件

     * @return string

     */

    public function uploadFile(){

        if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMime()&&$this->checkTrueImg()&&$this->checkHTTPPost()){

            $this->checkUploadPath();

            $this->uniName=$this->getUniName();

            $this->destination=$this->uploadPath.'/'.$this->uniName.'.'.$this->ext;

            if(@move_uploaded_file($this->fileInfo['tmp_name'], $this->destination)){

                return  $this->destination;

            }else{

                $this->error='文件移动失败';

                $this->showError();

            }

        }else{

            $this->showError();

        }

    }

}

1

2

3

4

5

6

<?php

header('content-type:text/html;charset=utf-8');

require_once 'upload.class.php';

$upload=new upload('myFile1','imooc');

$dest=$upload->uploadFile();

echo $dest;

五、下载

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>Insert title here</title>

</head>

<body>

<a href="1.rar">下载1.rar</a>

<br />

<a href="1.jpg">下载1.jpg</a>

<br />

<a href="doDownload.php?filename=1.jpg">通过程序下载1.jpg</a>

<br />

<a href="doDownload.php?filename=../upload/nv.jpg">下载nv.jpg</a>

<?php

?>

</body>

</html>

1

2

3

4

5

6

<?php

$filename=$_GET['filename'];

header('content-disposition:attachment;

filename='.basename($filename));

header('content-length:'.filesize($filename));

readfile($filename);

总结:

<form action="doAction.php" method="post" enctype="multipart/form-data">

<input type="file" name="myFile" /><br/>

二维数组的降维处理;

$_FILES变量

move_upload_file();copy();

tmp_name临时文件;

拓展名的提取;

真实图片的验证;

唯一文件名的生成;

函数封装以及调用;

利用单个文件函数实现多文件上传;

小功能的封装;

多文件的遍历;

面向对象的开发过程;

本文转至 https://www.php.cn/php-weizijiaocheng-429549.html PHP中文网

PHP实现文件上传下载实例详细讲解的更多相关文章

  1. ssm文件上传下载比较详细的案例

    背景:ssm框架 接下来,我会介绍单文件上传,下载,多文件的上传,下载,使用ajax进行文件的上传下载,和普通的表单提交的文件上传下载. 只要做项目,总是少不了文件的操作,好了废话不多说,直接上代码! ...

  2. JAVA中使用FTPClient实现文件上传下载实例代码

    一.上传文件 原理就不介绍了,大家直接看代码吧 ? 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 ...

  3. Struts2中文件上传下载实例

    1.单文件上传 jsp页面: <!-- 单文件上传 --> <form action="Fileupload.action" method="post& ...

  4. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  5. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  6. JavaWeb实现文件上传下载功能实例解析 (好用)

    转: JavaWeb实现文件上传下载功能实例解析 转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web ...

  7. nodejs+express-实现文件上传下载管理的网站

    Nodejs+Express-实现文件上传下载管理的网站 项目Github地址(对你有帮助记得给星哟):https://github.com/qcer/updo 后端:基于nodejs的express ...

  8. Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...

  9. jQuery.uploadify文件上传组件实例讲解

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  10. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

随机推荐

  1. Openlayers 距离环绘制

    思路:利用layer的StyleFunction 来使地图移动或者放缩的时候,使圆保持在地图中心 /** * 绘制距离环 * @param {number} distance 每环间隔距离,单位:米 ...

  2. 用 solon-ai 写个简单的 deepseek 程序(构建全国产 ai 智能体应用)

    用国产应用开发框架(及生态),对接国产 ai.构建全国产 ai 智能体应用. 1.先要申请个 apiKey 打开 https://www.deepseek.com 官网,申请个 apiKey .(一万 ...

  3. Linux - 基础环境检查

    检查操作系统:建议根据实际产品需要进行安装 检查主机名:集群中统一前缀并区分服务器功能,小写命名 检查内存:建议至少128G 检查CPU:建议至少2个支持超线程技术的10核芯片 检查磁盘:同一功能的服 ...

  4. 普通文本(.txt)篇章排版样式参考 [文档说明][日志]

    把普通文本的篇章排版样式归总一下,供自己参考,当然如果读者能以此借鉴并学习到一些东西,是笔者最大的鼓励. 日志类 [1] 头标 [时间日期][备注][属性]内容 [2] [文件信息][符号][文件信息 ...

  5. 百万架构师第四十六课:并发编程的原理(一)|JavaGuide

    百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 并发编程的原理 课程目标 JMM 内存模型 JMM 如何解决原子性.可见性.有序性的问题 Synchronize ...

  6. pycharm clone GitHub 提示 OpenSSL SSL_read: Connection was reset, errno 10054

    配置界面 错误提示 原因分析 clone的时候需要安全认证,当你在配置页面勾选上ssh ,就会报错 解决方案 在cmd里输入命令,然后再clone git config --global http.s ...

  7. RedisTemplate实现setnx分布式锁

    redis工具类 `package com.ttsx.activity.item.services.utils; import lombok.extern.slf4j.Slf4j; import or ...

  8. Mysql join算法深入浅出

    导语 联表查询在日常的数据库设计中非常的常见,但是联表查询可能会带来性能问题,为了调优.避免设计出有性能问题的SQL,在explain命令中,会显示用的是哪个join算法,学习一下join过程是非常有 ...

  9. 用状态模式开发一个基于WPF的截图功能

    状态模式 状态模式是设计模式中的一种行为设计模式,对很多人来说,这个模式平时可能用不到.但是如果你做游戏开发的话,我相信你应该对这个模式有一个很深刻的理解.状态模式在游戏中开发中还是比较常见的.状态模 ...

  10. IvorySQL 4.0 之 Invisible Column 功能解析

    前言 随着数据库应用场景的多样化,用户对数据管理的灵活性和隐私性提出了更高要求.IvorySQL 作为一款基于 PostgreSQL 并兼容 Oracle 的开源数据库,始终致力于在功能上保持领先和创 ...