参考
https://blog.csdn.net/weixin_42142057/article/details/97655591
后台返回一个File类型(文件流、byte)的数据给前端。
前端请求的时候
1、设置返回类型responseType,不管你用post\get\ect都要设置,还有post请求要设置content-type:multipart/from-data(跟文件上传一样,是接收文件的)
2、使用blob类型接收
vue 前端
export function getFileBlob(query) {
return request({
url: '/v1/t_blob',
method: 'get',
responseType: 'blob',
headers: {
'Content-Type': 'multipart/form-data'
},
params: query
})
}
getFileBlob({ url: url, fileName: localname }).then((res) => {
console.log('文件流结果')
try {
const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
const filename = fileName
var downloadElement = document.createElement('a')
var href = window.URL.createObjectURL(blob) // 创建下载的链接
var reg = /^["](.*)["]$/g
downloadElement.style.display = 'none'
downloadElement.href = href
downloadElement.download = decodeURI(filename.replace(reg, '$1')) // 下载后文件名
document.body.appendChild(downloadElement)
downloadElement.click() // 点击下载
document.body.removeChild(downloadElement) // 下载完成移除元素
window.URL.revokeObjectURL(href)
} catch (e) {
console.log('下载的文件出错', e)
}
})
PHP 后台
public function blob(Request $request){
$param = $request->param('');
//获取文件dir
$file_dir = $param['url'];
$filename = $param['fileName'];
$a = $this->check_exists($file_dir);
if(!$a){ //检测文件是否存在
echo "文件不存在!";
die();
}
// return file_get_contents($file_dir); // 返回文件流
return readfile($file_dir); // 返回文件流
}
/**
* 检查文件是否存在
* @param $file_http_path 文件完整路径 带http或者https
* @return bool
*/
public function check_exists($file_http_path){
// 远程文件
if(strtolower(substr($file_http_path, 0, 4))=='http'){
$header = get_headers($file_http_path, true);
return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'));
// 本地文件
}else{
return file_exists('.'.$file_http_path);
}
}
另 file_get_contents url 请求/传输数据
$url = "http://localhost/test/test.php";
$data=array('author '=> 'szy','intro'=> '哎呦,错了');
$data=http_build_query ($data);
$opts = array(
'http' => array(
'method' => 'POST',
'heade' => "Content-type:application/x-www-form-urlencoded Content-Length:".strlen ($data),
'content' =>$data
)
);
$context = stream_context_create($opts); // 文本数据量创建
$html = file_get_contents($url,false,$context);
print_r($html);
文件流
|