要件:ネットワークファイルをローカルにダウンロードした後、zipファイルにパッケージ化してクライアントにダウンロードします
テスト中、Baiduの画像アドレスを使用しましたが、すべてうまくいきました。オンラインテストにかけると、エラーが報告されました:function.file-get-contents]:ストリームを開くことができませんでした:HTTPリクエストに失敗しました!HTTP / 1.0 400不正なリクエスト
Baiduは、サーバーに制限がある可能性があることを発見しましたブラウザー以外のアクセスであり、php.ini構成を変更する必要があります:user_agent = "Mozilla / 4.0(互換; MSIE 6.0; Windows NT 5.0)"またはfile_get_contentsの直前に追加:ini_set( 'user_agent'、 "Mozilla / 4.0(互換; MSIE 6.0; Windows NT 5.0)”);
変更後にエラーが報告されましたが、ファイルはダウンロードできますが、間違っているため開くことができません。
バックグラウンドでは、ファイルに中国語が含まれているため、ファイル名のエンコードの問題である可能性があります。中国語の名前でファイルを操作する場合は、phpファイル関数をトランスコードする必要があります。全体のコードは次のとおりです
function dlfile($file_url, $save_to)
{
$file_url=iconv('utf-8','GBK',$file_url);//此处一定要使用GBK,而不是gb2312。因为gb2312只支持部分汉字,遇到繁体字或者生僻字时,就会转移失败,切记,避免入坑T_T都是类
$content = file_get_contents($file_url);
file_put_contents($save_to, $content);
}
//多文件打包
$dir = dirname(__FILE__);
$file_arr = [];
$fileList = array(
"http://111.111.111/222/0000003812/王3152153.pdf",
);
foreach($fileList as $v){
$ext = substr($v,strrpos($v,'.'));
$file_name = time().rand('9999','1000000').$ext;
$file_path = 'temp/'.$file_name;
$file_arr[] = $file_name;
dlfile($v,$file_path);
}
$filename = "test.zip";
$zip = new ZipArchive();
$zip->open($filename,ZipArchive::CREATE); //打开压缩包
foreach($file_arr as $file){
$zip->addFile($dir.'/temp/'.$file,$file); //向压缩包中添加文件
}
$zip->close();
上記のダウンロードプロセスは、ダウンロードする中国語の名前ファイルを文字列に変換するものであり、後でzipにダウンロードしても問題はありません。ただし、ファイルの中国語名を保持する必要がある場合があるため、次のようにコードを少し変更する必要があります。
//文件打包
$dir = dirname(__FILE__);
$file_arr = [];
$fileList = array(
"http://111.111.111/222/0000003812/王3152153.pdf",
"http://111.111.111/222/0000003812/李3152153.pdf",
);
foreach($fileList as $v){
$file_name = substr($v,strrpos($v,'/'+1));//保留文件的中文名
$file_path = 'temp/'.$file_name;
$file_path = iconv('utf-8','GBK',$file_path);//修改要保存文件的编码,win平台下需要该步骤。linux平台下不需要,因为linux平台编码默认为utf-8,与编辑器一直
$file_arr[] = $file_name;
dlfile($v,$file_path);
}
//中文名文件是无法直接添加到zip包中的,这里需要曲线救国
//第1步,先把下载到本地的文件改为英文字符串名,并建立中文名与英文名的对应关系数组
//第2步,把文件插入到zip包中
//第3步,使用zip类的更名函数,根据文件名对应关系数组,把文件名修改过来
//第4步,大功告成。如果你想把本地文件修改回中文名,一定要在close之后进行,否则zip会找不到文件
$filename = "test.zip";
$zip = new ZipArchive();
$zip->open($filename,ZipArchive::CREATE); //打开压缩包
$file_r_name = [];//文件名对应关系数组
foreach($file_arr as $v){
$ext = substr($v,strrpos($v,'.'));
$new_name = time().substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,10).rand(1000,100000).$ext;
rename(iconv('utf-8','gb2312',ROOT_PATH.'public_html/baogao/'.$v),ROOT_PATH.'public_html/baogao/'.$new_name);
$file_r_name[] = ['new_name'=>$new_name,'name'=>$v];
//win平台下使用该步骤,linux下不需要要iconv,理由同上
}
$os_name=PHP_OS;//获取操作系统名称
foreach($file_r_name as $val){
$zip->addFile(THINK_PATH.'../public_html/baogao/'.$val['new_name'],$val['new_name']); //向压缩包中添加文件
//修改压缩包中文件名修改为中文名
if(strpos($os_name,"Linux")!==false){
$zip->renameName($val['new_name'] , $val['name']);
}elseif(strpos($os_name,"WIN")!==false){
$zip->renameName($val['new_name'] , iconv('utf-8','GBK',$val['name']));
}
}
$zip->close();
header('Location: http://www.kd.com/baogao/'.$filename);
exit;