Rumah > pembangunan bahagian belakang > tutorial php > PHP实现支持GET,POST,Multipart/form-data的HTTP请求类,multipartform-data_PHP教程

PHP实现支持GET,POST,Multipart/form-data的HTTP请求类,multipartform-data_PHP教程

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2016-07-13 10:18:27
asal
1187 orang telah melayarinya

PHP实现支持GET,POST,Multipart/form-data的HTTP请求类,multipartform-data

本文实例讲述了PHP实现支持GET,POST,Multipart/form-data的HTTP请求类及其应用,分享给大家供大家参考。具体如下:

HttpRequest.class.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

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

235

236

237

238

239

240

241

242

243

<&#63;php

/** HttpRequest class, HTTP请求类,支持GET,POST,Multipart/form-data

*  Date:  2013-09-25

*  Author: fdipzone

*  Ver:  1.0

*

*  Func:

*  public setConfig   设置连接参数

*  public setFormdata  设置表单数据

*  public setFiledata  设置文件数据

*  public send     发送数据

*  private connect    创建连接

*  private disconnect  断开连接

*  private sendGet    get 方式,处理发送的数据,不会处理文件数据

*  private sendPost   post 方式,处理发送的数据

*  private sendMultipart multipart 方式,处理发送的数据,发送文件推荐使用此方式

*/

  

class HttpRequest{ // class start

  

  private $_ip = '';

  private $_host = '';

  private $_url = '';

  private $_port = '';

  private $_errno = '';

  private $_errstr = '';

  private $_timeout = 15;

  private $_fp = null;

    

  private $_formdata = array();

  private $_filedata = array();

  

  

  // 设置连接参数

  public function setConfig($config){

    $this->_ip = isset($config['ip'])&#63; $config['ip'] : '';

    $this->_host = isset($config['host'])&#63; $config['host'] : '';

    $this->_url = isset($config['url'])&#63; $config['url'] : '';

    $this->_port = isset($config['port'])&#63; $config['port'] : '';

    $this->_errno = isset($config['errno'])&#63; $config['errno'] : '';

    $this->_errstr = isset($config['errstr'])&#63; $config['errstr'] : '';

    $this->_timeout = isset($confg['timeout'])&#63; $confg['timeout'] : 15;

  

    // 如没有设置ip,则用host代替

    if($this->_ip==''){

      $this->_ip = $this->_host;

    }

  }

  

  // 设置表单数据

  public function setFormData($formdata=array()){

    $this->_formdata = $formdata;

  }

  

  // 设置文件数据

  public function setFileData($filedata=array()){

    $this->_filedata = $filedata;

  }

  

  // 发送数据

  public function send($type='get'){

  

    $type = strtolower($type);

  

    // 检查发送类型

    if(!in_array($type, array('get','post','multipart'))){

      return false;

    }

  

    // 检查连接

    if($this->connect()){

  

      switch($type){

        case 'get':

          $out = $this->sendGet();

          break;

  

        case 'post':

          $out = $this->sendPost();

          break;

  

        case 'multipart':

          $out = $this->sendMultipart();

          break;

      }

  

      // 空数据

      if(!$out){

        return false;

      }

  

      // 发送数据

      fputs($this->_fp, $out);

  

      // 读取返回数据

      $response = '';

  

      while($row = fread($this->_fp, 4096)){

        $response .= $row;

      }

  

      // 断开连接

      $this->disconnect();

  

      $pos = strpos($response, "\r\n\r\n");

      $response = substr($response, $pos+4);

  

      return $response;

  

    }else{

      return false;

    }

  }

  

  // 创建连接

  private function connect(){

    $this->_fp = fsockopen($this->_ip, $this->_port, $this->_errno, $this->_errstr, $this->_timeout);

    if(!$this->_fp){

      return false;

    }

    return true;

  }

  

  // 断开连接

  private function disconnect(){

    if($this->_fp!=null){

      fclose($this->_fp);

      $this->_fp = null;

    }

  }

  

  // get 方式,处理发送的数据,不会处理文件数据

  private function sendGet(){

  

    // 检查是否空数据

    if(!$this->_formdata){

      return false;

    }

  

    // 处理url

    $url = $this->_url.'&#63;'.http_build_query($this->_formdata);

      

    $out = "GET ".$url." http/1.1\r\n";

    $out .= "host: ".$this->_host."\r\n";

    $out .= "connection: close\r\n\r\n";

  

    return $out;

  }

  

  // post 方式,处理发送的数据

  private function sendPost(){

  

    // 检查是否空数据

    if(!$this->_formdata && !$this->_filedata){

      return false;

    }

  

    // form data

    $data = $this->_formdata&#63; $this->_formdata : array();

  

    // file data

    if($this->_filedata){

      foreach($this->_filedata as $filedata){

        if(file_exists($filedata['path'])){

          $data[$filedata['name']] = file_get_contents($filedata['path']);

        }

      }

    }

  

    if(!$data){

      return false;

    }

  

    $data = http_build_query($data);

  

    $out = "POST ".$this->_url." http/1.1\r\n";

    $out .= "host: ".$this->_host."\r\n";

    $out .= "content-type: application/x-www-form-urlencoded\r\n";

    $out .= "content-length: ".strlen($data)."\r\n";

    $out .= "connection: close\r\n\r\n";

    $out .= $data;

  

    return $out;

  }

  

  // multipart 方式,处理发送的数据,发送文件推荐使用此方式

  private function sendMultipart(){

  

    // 检查是否空数据

    if(!$this->_formdata && !$this->_filedata){

      return false;

    }

  

    // 设置分割标识

    srand((double)microtime()*1000000);

    $boundary = '---------------------------'.substr(md5(rand(0,32000)),0,10);

  

    $data = '--'.$boundary."\r\n";

  

    // form data

    $formdata = '';

  

    foreach($this->_formdata as $key=>$val){

      $formdata .= "content-disposition: form-data; name=\"".$key."\"\r\n";

      $formdata .= "content-type: text/plain\r\n\r\n";

      if(is_array($val)){

        $formdata .= json_encode($val)."\r\n"; // 数组使用json encode后方便处理

      }else{

        $formdata .= rawurlencode($val)."\r\n";

      }

      $formdata .= '--'.$boundary."\r\n";

    }

  

    // file data

    $filedata = '';

  

    foreach($this->_filedata as $val){

      if(file_exists($val['path'])){

        $filedata .= "content-disposition: form-data; name=\"".$val['name']."\"; filename=\"".$val['filename']."\"\r\n";

        $filedata .= "content-type: ".mime_content_type($val['path'])."\r\n\r\n";

        $filedata .= implode('', file($val['path']))."\r\n";

        $filedata .= '--'.$boundary."\r\n";

      }

    }

  

    if(!$formdata && !$filedata){

      return false;

    }

  

    $data .= $formdata.$filedata."--\r\n\r\n";

  

    $out = "POST ".$this->_url." http/1.1\r\n";

    $out .= "host: ".$this->_host."\r\n";

    $out .= "content-type: multipart/form-data; boundary=".$boundary."\r\n";

    $out .= "content-length: ".strlen($data)."\r\n";

    $out .= "connection: close\r\n\r\n";

    $out .= $data;

  

    return $out;

  }

} // class end

  

&#63;>

Salin selepas log masuk

demo示例程序如下:

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

<&#63;php

require('HttpRequest.class.php');

  

$config = array(

      'ip' => 'demo.fdipzone.com', // 如空则用host代替

      'host' => 'demo.fdipzone.com',

      'port' => 80,

      'errno' => '',

      'errstr' => '',

      'timeout' => 30,

      'url' => '/getapi.php',

      //'url' => '/postapi.php',

      //'url' => '/multipart.php'

);

  

$formdata = array(

  'name' => 'fdipzone',

  'gender' => 'man'

);

  

$filedata = array(

  array(

    'name' => 'photo',

    'filename' => 'photo.jpg',

    'path' => 'photo.jpg'

  )

);

  

$obj = new HttpRequest();

$obj->setConfig($config);

$obj->setFormData($formdata);

$obj->setFileData($filedata);

$result = $obj->send('get');

//$result = $obj->send('post');

//$result = $obj->send('multipart');

  

echo '<pre class="brush:php;toolbar:false">';

print_r($result);

echo '

Salin selepas log masuk
'; ?>

完整实例代码可以点击此处本站下载。

希望本文所述对大家的PHP程序设计有所帮助。

【急】对于PHP中文件上传 POST传值问题 不确定是enctype="multipart/form-data"属性问题还是版本问题

文件上传类型为file的控件,后台获取时只能用$_FILES来获取,其他的控件类型才是用$_POST来获取,你只需要用$_FILES获取的值来进行你的处理。
 

js 模拟POST提交enctype="multipart/form-data"类型的表单

只是需要文件上传才用它的
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
改成
xmlHttp.setRequestHeader("Content-Type","multipart/form-data;");

至于发送二进制数据,你自己解决吧。
-----------------------------7db8c30150364 这个其实有规律的
就是一个开始段一个结束段,7db8c30150364 只是用一串不重复的字符,标识一起其中间的东西就是数据,Content-Disposition: form-data; name="polls[]" 这个是用来表示什么数据,文件名是啥。

其实在socket发包中,上传文件的时候就要这么用,有空研究一下HTTP里面POST 文件时,应该如何处理。
 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/883686.htmlTechArticlePHP实现支持GET,POST,Multipart/form-data的HTTP请求类,multipartform-data 本文实例讲述了PHP实现支持GET,POST,Multipart/form-data的HTTP请求类及其应用,分享...
Label berkaitan:
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan