1. 程式人生 > >使用php://input接收資料流(還有多個引數的解決辦法)

使用php://input接收資料流(還有多個引數的解決辦法)

最近的工作中接觸到一個手機上傳圖片到伺服器的小程式,剛開始一直在想該用怎樣的方式去接收資料,最後在網上看到大家都用php://input來接收。就去查了下php://input的官方介紹,確實可以,除了在enctype="multipart/form-data"情況下,是無法接收到流的,其他情況下都可以。既然這個可以,我就在本地先寫個測試檔案

上傳檔案
 <?php
//@file phpinput_post.php
$data=file_get_contents('btn.png');
$http_entity_body = $data;
$http_entity_type = 'application/x-www-form-urlencoded';
$http_entity_length = strlen($http_entity_body);
$host = '127.0.0.1';
$port = 80;
$path = '/image.php';
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
  fputs($fp, "POST {$path} HTTP/1.1\r\n");
  fputs($fp, "Host: {$host}\r\n");
  fputs($fp, "Content-Type: {$http_entity_type}\r\n");
  fputs($fp, "Content-Length: {$http_entity_length}\r\n");
  fputs($fp, "Connection: close\r\n\r\n");
  fputs($fp, $http_entity_body . "\r\n\r\n");
 
  while (!feof($fp)) {
    $d .= fgets($fp, 4096);
  }
  fclose($fp);
  echo $d;
}
?>

接收檔案
<?php
/**
 *Recieve image data
**/ 
error_reporting(E_ALL);

function get_contents() { 
  $xmlstr= file_get_contents("php://input");
  $filename=time().'.png';
  if(file_put_contents($filename,$xmlstr)){
 echo 'success';
  }else{
 echo 'failed';
  }
}
get_contents();
?>

執行test.php你就可以看到相應的結果,成功了,也在相應目錄下看到了我剛才上傳的檔案。如果你做服務端,就只需要接收檔案裡面的php程式碼了。我上面模擬的上傳就需要根據客戶端來相應構造了,我後面也和客戶端對接上了。所以是可以用的,還有就是客戶端上傳的時候可能會一些資料問題,因為我們在這個過程中出現了各種狀況。

下文轉自:http://www.0377joyous.com/archives/1135.html

今天公司要求用APP傳送一個圖片到PHP程式接收並儲存起來,而且中間還需要很多引數!
以前沒有做過APP和PHP互動,這次算是一個挑戰吧(對一個沒有人指導實習生來說)

1.APP發1.jpg,而且帶有兩個引數一個是假設是X和另外一個假設是Y
2.PHP負責接受X,Y和1.jpg,並且還要儲存1.jpg到伺服器
步驟:
1.PHP頁面程式碼
$data = file_get_contents(‘php://input’);//這樣可以獲取到未經處理的原資料(保持傳送的圖片流不被破壞),在APP上使用X#Y#圖片流使用http傳送到PHP頁面
//然後PHP頁面進行資料處理和分割
2.資料處理
先分割資料流
$vars = explode(“#”,$data,3);//這樣防止對圖片流造成破壞只分割成三份即可
/*省去若干程式碼*/
$img = $vars[2];
$path = ‘/var/www/uploads/’;
$newfilename = time().”.jpg”;
$file = $path.$newfilename;
$handle = fopen($file, “w”);

if ($handle) {fwrite($handle,$img);
fclose($handle);
}
^_^,看看/var/www/目錄下是不是生成了一個圖片?