我目前要用php做个代理层
html file 上传的文件 我要直接获取文件流
然后吧文件流分块传出去
首先了解下 php的上传流程
php内置函数 $_FILES $_POST 在调用这2个函数的时候 会自动解析 php://input
而且php内核也会先处理 php://input 然后把流解析并生成到缓存文件里面
如果流呗读取过,那么这个流就不能再次读取,所以需要在php没有读取文件流之前 把文件流读取到
有2个方法
1.写一个php的C扩展 取代$_FILES
2.修改php.ini (如果你的服务器只有一个程序,可以修改,不然就会影响其他程序)
2.1 nginx.conf
proxy_request_buffering off;
fastcgi_request_buffering off;
2.2 php.ini
memory_limit = 8M (忘记这个要不要改了)
file_uploads = Off
upload_max_filesize = 0M
post_max_size = 0M
然后就可以直接获取流
function actionImg4(){
$fp = fopen("php://input", "r");
$wfp = fopen("/data/1.png",'w+');
while(!feof($fp)){
$buffer = fread($fp,1000);
fwrite($wfp, $buffer);
}
fclose($wfp);
fclose($fp);
}
//前端上传文件时 调用这个接口
function actionImg5(){
$url = "http://xxxx.com/api/cuzntest/img4"; //接收方
$fopen = fopen ("php://input", "r");
$size = $_SERVER['HTTP_CONTENT_LENGTH']; //获取流大小
$x = $this->curlUpload1($url,$fopen,$size);
fclose($fopen);
var_dump($x);
}
function curlUpload1($url,$fd,$size){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/binary","Expect:") );
curl_setopt($ch, CURLOPT_READFUNCTION,
function ($ch, $fd, $length) {
$data = fread($fd, 1000);
// file_put_contents('/data/1.txt', $data.'------------------------',FILE_APPEND);
$len = strlen($data);
return $data;
}
);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept: */*',
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
'Connection: Keep-Alive'));
curl_setopt($ch, CURLOPT_INFILE, $fd);
curl_setopt($ch, CURLOPT_INFILESIZE, $size);
$ret['tmpInfo'] = curl_exec($ch);
$ret['error_code'] = curl_errno($ch);
$ret['error_msg'] = curl_error($ch);
$ret['getinfo'] = curl_getinfo($ch);
curl_close($ch);
return $ret;
}
用postman 测试是 需要改 Content-Type multipart/form-data -> x-multipart/form-data
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权