在HTTP数据传送过程当中,传输一方直接以二进制流方式传送文件内容,这样就造成了一个文件流;php
文件流的接收一般涉及到预约义变量函数 $HTTP_RAW_POST_DATA 和 file_get_contentshtml
/* * PHP 模拟发送流文件 * #param String $receive_url 接收流文件请求的网址 * #param String $send_file_name 发送的文件名,带路径 * @return boolean */ function send_stream_file($receive_url, $send_file_name) { if (!file_exists($send_file_name)) { return false; } $options = [ // 设置文件流的参数 'http' => [ 'method' => 'POST', // POST方式传递 'header' => 'content-type:application/x-www-form-urlencoded', // POST 方式传递数据的标准编码格式 'content' => file_get_contents($send_file_name), // 将文件写入到字符串中 ], ]; $context = stream_context_create($options); // 将文件转换成文件流 $response = file_get_contents($receive_url, false, $context); // 发送请求 if ($response !== false) { return true; } return false; }
/*** * PHP 接收流文件 * @param String $$receive_file_name 接收后保存的文件名 * @return boolean */ function receive_stream_file($receive_file_name) { $stream_data = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; // 使用 $GLOBALS['HTTP_RAW_POST_DATA'] 接收数据 if (empty($stream_data)) { // 不存在数据则使用 file_get_contents 方式来接收 $stream_data = file_get_contents('php://input'); } $result = false; if ($stream_data != '') { $result = file_put_contents($receive_file_name, $stream_data, true); // 保存文件 } return $result; }
/* * 复制文件流到文件中 * @param String $src 源 * @param String $dest 新资源 */ function copy_stream($src, $dest) { $fsrc = fopen($src, 'r'); $fdest = fopen($dest, 'w+'); $len = stream_copy_to_stream($fsrc, $fdest); // 流的复制 fclose($fsrc); fclose($fdest); return $len; }