项目中,有一需求:为保证对方数据安全,并禁止下载,对方指定网址指定端口号,并对其访问设置白名单,通过一定规则访问到内部资源数据,访问成功则返回文件流。
对返回的文件流,进行保存,并存入数据库,以便后续使用。
起初我并未处理过文件流,就使用 file_get_contents 和 file_put_contents 进行处理,但得不到结果。后续查阅函数发现 stream_copy_to_stream() 这个函数。专门对数据流进行复制保存。
$url = 'http://ip:port';
$var = '/home/img?p=thumbs';
$prefix = 'source_';
$dest_dir = '/dev/resource_center/';
$data = [
'high' => 'high_pict',
'big' => 'big_pict',
'small' => 'small_pict'
];
$fields = implode(',', array_map(function($v) use ($prefix) {return $prefix.$v;},$data));
$sql = 'select ' . $fields . ' from books ………………';
foreach ($res as $key => $value) {
$source = str_replace('/pro/upload', $url . $var, $value);
$data_key = array_search(substr($key,strlen($prefix)), $data);
$img_path = copy_file($source, $dest_dir . $data_key);
var_dump($img_path);
}
function copy_file($source, $dest) {
is_dir($dest) || mkdir($dest, 0777, true);
$dest = $dest . '/' . basename($source);
@$fsource = fopen($source, 'r');
@$fdest = fopen($dest, 'w+');
@$res = stream_copy_to_stream($fsource, $fdest);
@fclose($fsource);
@fclose($fdest);
($res === false) && unlink($dest);
return ($res === false) ? false : $dest;
}
|