一、下载oss图片到本地 打包zip实力代码如下
<?php
//
public function card_img(){
$name = 'zip文件名称';
$list = db('storevoteuser')->column('card_img','uid');//将需要导出的数据转换成数组格式
$path = BASE_UPLOAD_PATH . '/' . ATTACH_STORE .'/user/'.session('store_id').'/zip/'.$tid.'/';
if (!is_dir($path)) { //判断目录是否存在 不存在就创建
mkdir($path, 0777, true);
}
$img = [];
foreach($list as $index=>$item){
//图片绝对地址
$filePath = $path.$index.'.png';
if(!file_exists($filePath)){
$this->downLoad($item,$filePath);
}
$img[] = $filePath;
}
header('content-type:image/jpg');
//缓存zip地址
$filename = BASE_UPLOAD_PATH . '/' . ATTACH_STORE .'/user/'.session('store_id').'/zip/'.$tid.'/tmp.zip';
$zip = new \ZipArchive();
$zip->open($filename, \ZipArchive::OVERWRITE | \ZIPARCHIVE::CREATE | \ZIPARCHIVE::CM_STORE);
foreach ($list as $k=>$v){
$fileData = file_get_contents($v);
$temp = explode('.', $v);
$ext = $temp[count($temp)-1];
$rand = mt_rand(0000,9999);
if ($fileData) {
$zip->addFromString($k. '_' . $rand . '.' . $ext, $fileData);
}
}
$zip->close();
$file = fopen($filename, "r");
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: " . filesize($filename));
Header("Content-Disposition: attachment; filename=$name.zip");
//一次只传输1024个字节的数据给客户端
$buffer = 1024; //
while (!feof($file)) {
//将文件读入内存
$file_data = fread($file, $buffer);
//每次向客户端回送1024个字节的数据
echo $file_data;
}
fclose($file);
unlink($filename); //删除文件
}
/*
*object oss存储文件路径
*downPath 本地保存绝对路径
*
*/
public function downLoad($object,$downPath){
$accessKeyId = "阿里云accessKeyId";
$accessKeySecret = "阿里云accessKeySecret";
// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = "阿里云oss 外网地址endpoint d";
$bucket= "存储空间名称";
//下载地址
$options = array(
OssClient::OSS_FILE_DOWNLOAD => str_replace('/','\\',$downPath)
);
// 使用try catch捕获异常,如果捕获到异常,则说明下载失败;如果没有捕获到异常,则说明下载成功。
// 使用try catch捕获异常。如果捕获到异常,则说明下载失败;如果没有捕获到异常,则说明下载成功。
try{
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
$ossClient->getObject($bucket, $object, $options);
return true;
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return false;
}
}
二、如需其他语言可以前往下面地址查看对应SDK
三、总结
实际下载情况按照自己的逻辑修改、按照SDK步骤不会存在问题