最近做的项目是一个图片的项目,刚开始偷懒上传到的是本机服务器上的路径地址,然后上传到线上一段时间之后,人多服务器带不起来了,就赶紧将图片地址由本机地址,上传到阿里云oss上,然后现在就开始遇见难题了,首先要判断地址是否是https请求的,如果是https请求的则替换方法,目前先将,本地服务器打包下载文件,和线上图片地址下载,访问打包下载放上,然后在整合代码。
本地服务器下载图片,打包下载
# 本机服务器打包下载 好的代码,现在欠缺的是 循环得出所有的图片地址
public function downzip()
{
# 本机的图片地址
$fileList = array(
ROOT_PATH.'public/uploads/images/20200430/6ae71761fe4679d4f667159550fec794.jpg',
ROOT_PATH.'public/uploads/images/20200506/1fc409f456bd4d048d4de19b46e9f203.jpg',
ROOT_PATH.'public/uploads/images/20200506/fa1775a7e7cf8b4ecc69fea1069577ce.jpg'
);
$zip = new \ZipArchive; // 实例化zip对象
$zip_time = time().".zip"; // 压缩的目录名
$zip_filename = ROOT_PATH."public/uploads".$zip_time; // 指定一个压缩包地址,你当前项目的文件地址。
$zip->open($zip_filename,\ZipArchive::CREATE); //打开压缩包 如果没有则 创建
# 对这个图片地址进行循环遍历,
foreach($fileList as $file){
# 循环遍历下载文件。
$zip->addFile($file,basename($file)); //向压缩包中添加文件
}
$zip->close(); //关闭压缩包
# 下载 文件
header("Content-type:text/html;charset=utf-8");
$file_name = iconv("utf-8","gb2312",$zip_time);
# 将反斜杠 替换成正斜杠
$file_path = str_replace('\\','/',$zip_filename);
if(!file_exists($file_path)){
echo "下载文件不存在!";exit; //如果提示这个错误,很可能你的路径不对,可以打印$file_sub_path查看
}
$fp=fopen($file_path,"r");
$file_size=filesize($file_path);
//下载文件需要用到的头
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename = ". $file_name);
$buffer=1024;
$file_count=0;
while(!feof($fp) && $file_count<$file_size){
$file_con=fread($fp,$buffer);
$file_count+=$buffer;
echo $file_con;
}
fclose($fp); //关闭这个打开的文件
// unlink($zip_filename) // 开启之后,会自动将本机服务器上的zip包删除,首先可以降低资源,不好的是没有备份
}
线上图片地址整合
# 线上地址 打包下载
public function demo()
{
$files = [
'https://dss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3252521864,872614242&fm=26&gp=0.jpg',
'https://dss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=4018557288,1217151095&fm=26&gp=0.jpg'
];
$zip = new \ZipArchive;
$zip_time = time().".zip"; // 可随机生成压缩的目录名
$zip_filename = ROOT_PATH."public/uploads".$zip_time; // 指定一个压缩包地址
$zip->open($zip_filename,\ZipArchive::CREATE); //打开压缩包如果没有回自动创建
foreach ($files as $file) {
# 模拟curl访问发送请求
$ch = curl_init(); # 初始化curl
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch,CURLOPT_URL,$file);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 访问的是 ssl地址,不设置会报错
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$fileContent = curl_exec($ch); // 发送这个请求
curl_close($ch);// 关闭curl;
$zip->addFromString(basename($file), $fileContent);
}
$res = $zip->close();
dump($res);// 如果为true则代表图片打包成功
# 注意这个没有打包下载,如需打包下载,可参考上块代码,粘贴复制,找好路径即可。
}
线上访问这个偷了懒,模拟curl请求,然后这个的速度会很慢,尤其是图片多了之后,这是因为没打包一次即代表发送了一次请求,所以这个的速度会很慢,还需要优化,新需求,因为本身我是要去oss上去下载图片,所以老板是说了可以不要直接打包下载,将oss上面的图片复制一份放到一个目录就行,下载的话让用户自己去下载就好了,再重新搞,正好oss的还不会用,勤学勤练,明天将数据库的导入导出搞定。