Heim > Backend-Entwicklung > PHP-Tutorial > php 下载文件的代码分享

php 下载文件的代码分享

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-07-25 08:56:59
Original
1291 Leute haben es durchsucht
本文介绍下,在php中,实现下载文件的一些方法与代码,包括系统函数调用、wget、以及socket连接方式下载文件等。有需要的朋友作个参考吧。

在php中实现下载文件,方法大多是如下二种: 一种是使用system、exec等即有的函数调用系统自带的下载工具,比如 wget 之类的来下载文件。 另一种是使用php本身利用Socket来下载文件。

笔者喜欢用第二种方式。

使用Socket下载文件,如果是http协议的文件,必须明白HTTP协议的运行过程,如果是FTP协议的则要了解ftp协议运行过程。 比如HTTP协议访问一个文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<?php

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);

if (!$fp) {

        echo "$errstr ($errno)<br />\n";

} else {

    $out = "GET / HTTP/1.1\r\n";

    $out .= "Host: www.example.com\r\n";

    $out .= "Connection: Close\r\n\r\n";

 

    fwrite($fp, $out);

        while (!feof($fp)) {

            echo fgets($fp, 128);

        }

    fclose($fp);

}

?>

Nach dem Login kopieren

使用fopen直接访问远程文件来达到目的,同时又可以访问http,也能访问ftp。 当然,如果按照上面的思路来说,也可以使用ftp的函数库来实现。

使用fopen函数的例子:

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

#! /usr/bin/php

<?php

error_reporting(0);

set_time_limit(0);

 

//无参数则给出提示

if ($argc < 2){

  echo "Usage: ". $argv[0] ." URL [Destination]\n\n";

  exit();

}

 

//设置获取基本变量

$url = $argv[1];

$save_path = $argv[2] ? $argv[2] : "./";

$file_name = array_pop(explode("/", $url));

$localfile = $save_path . $file_name;

 

//检查变量

if (!check_url($url)){

   exit("Error: URL ". $url ." invalid.\n\n");

}

if (file_exists($localfile)){

   exit("Error: local file ". $localfile ." exists.\n\n");

}

 

//打开远程文件

$fp = fopen($url, "rb");

if (!$fp){

   exit("Error: Download ". $url ." failed.\n\n");

}

 

//打开本地文件

$sp = fopen($localfile, "wb");

if (!$sp){

   exit("Error: Open local file ". $localfile ." failed.\n\n");

}

 

//下载远程文件

echo "Downloading, please waiting...\n\n";

while (!feof($fp)){

    $tmpfile .= fread($fp, 1024);

}

 

//保存文件到本地

fwrite($sp, $tmpfile);

fclose($fp);

fclose($sp);

echo "Download file ". $file_name ." succeed!\n\n";

 

/* 检查URL合法性函数 */

function check_url($url){

   return preg_match("/^(http|ftp)(:\/\/)([a-zA-Z0-9-_]+[\.\/]+[\w\-_\/]+.*)+$/i", $url);   

}

?>

Nach dem Login kopieren

以上代码保存为 download.php 文件,加上可执行属性: chmod +x download.php

执行,注意脚本的路径要正确: #! /usr/local/php/bin/php

使用上面的脚本来下载文件: download.php 远程文件 保存路径

如把Google Talk程序下载到我们的 /tmp 目录下: download.php http://dl.google.com/googletalk/googletalk-setup.exe /tmp/

如果不出错,等待一会就能够在 /tmp/ 目录下看到 googletalk-setup.exe 文件。

这里分享一个更强的HTTP下载类:

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

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

<?

/*=================

// 织梦Http下载类

=======================*/

class DedeHttpDown

{

var $m_url = "";

var $m_urlpath = "";

var $m_scheme = "http";

var $m_host = "";

var $m_port = "80";

var $m_user = "";

var $m_pass = "";

var $m_path = "/";

var $m_query = "";

var $m_fp = "";

var $m_error = "";

var $m_httphead = "" ;

var $m_html = "";

//

//初始化系统

//

function PrivateInit($url)

{

      $urls = "";

      $urls = @parse_url($url);

      $this->m_url = $url;

        if(is_array($urls))

        {

        $this->m_host = $urls["host"];

        if(!empty($urls["scheme"])) $this->m_scheme = $urls["scheme"];

      

        if(!empty($urls["user"])){

        $this->m_user = $urls["user"];

        }

      

        if(!empty($urls["pass"])){

        $this->m_pass = $urls["pass"];

        }

 

        if(!empty($urls["port"])){

        $this->m_port = $urls["port"];

        }

      

        if(!empty($urls["path"])) $this->m_path = $urls["path"];

        $this->m_urlpath = $this->m_path;

      

        if(!empty($urls["query"]))

        {

        $this->m_query = $urls["query"];

        $this->m_urlpath .= "?".$this->m_query;

        }

     }

}

//

//打开指定网址

//

function OpenUrl($url)

{

     //重设各参数

     $this->m_url = "";

     $this->m_urlpath = "";

     $this->m_scheme = "http";

     $this->m_host = "";

     $this->m_port = "80";

     $this->m_user = "";

     $this->m_pass = "";

     $this->m_path = "/";

     $this->m_query = "";

     $this->m_error = "";

     $this->m_httphead = "" ;

     $this->m_html = "";

     $this->Close();

     //初始化系统

     $this->PrivateInit($url);

     $this->PrivateStartSession();

}

//

//获得某操作错误的原因

//

function printError()

{

     echo "错误信息:".$this->m_error;

     echo "具体返回头:<br>";

     foreach($this->m_httphead as $k=>$v)

     { echo "$k => $v <br>\r\n"; }

}

//

//判别用Get方法发送的头的应答结果是否正确

//

function IsGetOK()

{

     if( ereg("^2",$this->GetHead("http-state")) )

     { return true; }

     else

     {

      $this->m_error .= $this->GetHead("http-state")." - ".$this->GetHead("http-describe")."<br>";

      return false;

     }

}

//

//看看返回的网页是否是text类型

//

function IsText()

{

     if(ereg("^2",$this->GetHead("http-state"))

      && eregi("^text",$this->GetHead("content-type")))

     { return true; }

     else

     {

      $this->m_error .= "内容为非文本类型<br>";

      return false;

     }

}

//

//判断返回的网页是否是特定的类型

//

function IsContentType($ctype)

{

     if(ereg("^2",$this->GetHead("http-state"))

      && $this->GetHead("content-type")==strtolower($ctype))

     { return true; }

     else

     {

      $this->m_error .= "类型不对 ".$this->GetHead("content-type")."<br>";

      return false;

     }

}

//

//用Http协议下载文件

//

function SaveToBin($savefilename)

{

     if(!$this->IsGetOK()) return false;

     if(@feof($this->m_fp))

     { $this->m_error = "连接已经关闭!"; return false; }

     $fp = fopen($savefilename,"w") or die("写入文件 $savefilename 失败!");

     while(!feof($this->m_fp)){

      @fwrite($fp,fgets($this->m_fp,256));

     }

     @fclose($this->m_fp);

     return true;

}

//

//保存网页内容为Text文件

//

function SaveToText($savefilename)

{

     if($this->IsText()) $this->SaveBinFile($savefilename);

     else return "";

}

//

//用Http协议获得一个网页的内容

//

function GetHtml()

{

     if(!$this->IsText()) return "";

     if($this->m_html!="") return $this->m_html;

     if(!$this->m_fp||@feof($this->m_fp)) return "";

     while(!feof($this->m_fp)){

      $this->m_html .= fgets($this->m_fp,256);

     }

     @fclose($this->m_fp);

     return $this->m_html;

}

//

//开始HTTP会话

//

function PrivateStartSession()

{

     if(!$this->PrivateOpenHost()){

      $this->m_error .= "打开远程主机出错!";

      return false;

     }

     if($this->GetHead("http-edition")=="HTTP/1.1") $httpv = "HTTP/1.1";

     else $httpv = "HTTP/1.0";

     fputs($this->m_fp,"GET ".$this->m_urlpath." $httpv\r\n");

     fputs($this->m_fp,"Host: ".$this->m_host."\r\n");

     fputs($this->m_fp,"Accept: */*\r\n");

     fputs($this->m_fp,"User-Agent: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2)\r\n");

     //HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束

     if($httpv=="HTTP/1.1") fputs($this->m_fp,"Connection: Close\r\n\r\n");

     else fputs($this->m_fp,"\r\n");

     $httpstas = fgets($this->m_fp,256);

     $httpstas = split(" ",$httpstas);

     $this->m_httphead["http-edition"] = trim($httpstas[0]);

     $this->m_httphead["http-state"] = trim($httpstas[1]);

     $this->m_httphead["http-describe"] = "";

     for($i=2;$i<count($httpstas);$i++){

      $this->m_httphead["http-describe"] .= " ".trim($httpstas[$i]);

     }

     while(!feof($this->m_fp)){

      $line = str_replace("\"","",trim(fgets($this->m_fp,256)));

      if($line == "") break;

      if(ereg(":",$line)){

       $lines = split(":",$line);

       $this->m_httphead[strtolower(trim($lines[0]))] = trim($lines[1]);

      }

     }

}

//

//获得一个Http头的值

//

function GetHead($headname)

{

     $headname = strtolower($headname);

     if(isset($this->m_httphead[$headname]))

      return $this->m_httphead[$headname];

     else

      return "";

}

//

//打开连接

//

function PrivateOpenHost()

{

     if($this->m_host=="") return false;

     $this->m_fp = @fsockopen($this->m_host, $this->m_port, &$errno, &$errstr,10);

     if(!$this->m_fp){

      $this->m_error = $errstr;

      return false;

     }

     else{

      return true;

     }

}

//

//关闭连接

//

function Close(){

     @fclose($this->m_fp);

}

}

?>

Nach dem Login kopieren

调用示例: 1,下载网页

1

2

3

4

5

6

<?

$httpdown = new DedeHttpDown();

$httpdown->OpenUrl("http://bbs.it-home.org");

echo $httpdown->GetHtml();

$httpdown->Close();

?>

Nach dem Login kopieren

2,下载图片并保存

1

2

3

4

5

6

7

<?

$httpdown = new DedeHttpDown();

$httpdown->OpenUrl("http://img.jbxue.com/images/1.jpg");

echo $httpdown->SaveBin("test.jpg");

$httpdown->Close();

echo "<img  src='test.jpg' alt="php 下载文件的代码分享 " >";

?>

Nach dem Login kopieren


Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage