溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php下載遠(yuǎn)程文件的源碼是什么

發(fā)布時(shí)間:2020-10-29 10:07:24 來源:億速云 閱讀:183 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)php下載遠(yuǎn)程文件的源碼是什么,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

最近遇到下載pdf格式的文件存在問題 下載后看不了還有下載不了的問題

大致思路是將文件先從遠(yuǎn)程下載后  再讀取下載到用戶本地電腦 再將文件刪除 不多說了 直接貼源碼

遠(yuǎn)程文件的命名 最好使用英文數(shù)字組合 ,不要用中文命名 總會遇到你想不到的問題

里面也包括壓縮下載 具體 大家看源碼 研究吧

<?php
set_time_limit(0);
//允許下載的url
$allowed_url = [
    '',
    '',
    '']; // 允許的url
//$file_urls = post('file_urls');
$file_urls = '';//遠(yuǎn)程文件路徑

$file_url_arr = explode(',', $file_urls);
$file_url_arr = array_unique($file_url_arr); // 過濾相同url

//foreach ($file_url_arr as $key => $val) {
//    $url_arr = parse_url($val);
//    if (!isset($url_arr['host']) || !in_array($url_arr['host'], $allowed_url)) {
//        unset($file_url_arr[$key]);
//    }
//}
if (empty($file_url_arr)) {
    $output = array(
        'status' => 2,
        'code' => 999,
        'error' => '未找到合法url',
    );
    exit(json_encode($output));
}

$download_dir = ROOT.'download'.DIRECTORY_SEPARATOR;
if(!file_exists($download_dir)) mkdir($download_dir, 0777, true);
$tmp_dir = $download_dir.time().rand(100, 999).DIRECTORY_SEPARATOR; // 文件臨時(shí)存放目錄

$downloader = new fileDownloader();

if($file_url_arr && !empty($file_url_arr)) $downloader->download($tmp_dir, $file_url_arr); // 下載文件

$file_lists = scandir($tmp_dir);
$file_lists = array_diff($file_lists, ['.', '..']);
$file_lists = array_values($file_lists); // 重置索引
if(empty($file_lists)){
    $output = array(
        'status' => 2,
        'code' => 999,
        'error' => '無下載文件',
    );
    exit(json_encode($output));
}

//if (count($file_lists) > 1) { // 如果是多個(gè)文件就壓縮
//    $file_name = $downloader->compress($tmp_dir, $subject_title);
//} else {
    $file_name = $file_lists[0]; // 如果是單個(gè)文件就直接輸出
//}

$file_headers = get_headers($file_urls, 1);
header("Cache-Control: public");
header("Content-Description: File Transfer");
//header('Content-disposition: attachment; filename='.basename($file_name)); //文件名
header('Content-Type: '.$file_headers['Content-Type']); //zip
header("Content-Transfer-Encoding: binary"); //二進(jìn)制文件
header('Content-Length: '. filesize($tmp_dir.$file_name)); //文件大小

$user_agent = $_SERVER["HTTP_USER_AGENT"];
$encoded_name = rawurlencode($file_name);
if (preg_match("/Firefox/", $user_agent)) { //火狐瀏覽器
    header('Content-Disposition: attachment; filename*=utf-8\'\''.$encoded_name);
} else { // IE, 谷歌瀏覽器
    header('Content-Disposition: attachment; filename="' . $file_name . '"');
}
ob_clean();
flush();
@readfile($tmp_dir.$file_name);
$downloader->deleteDir($tmp_dir);

//文件下載類
class fileDownloader{

    // 下載文件
    // $dir 文件存放地址,絕對路徑
    // $urls 文件下載地址
    public function download($dir, $urls = array()){
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
        }
        if (empty($urls)) {
            return;
        }

        foreach ($urls as $val) {
            $file_name_arr = explode('/', $val); // 使用 / 分隔url
            $file_name = array_pop($file_name_arr); // 彈出數(shù)組的最后一個(gè)元素,作為文件名

            // 如果以linux作為主機(jī),需要將utf文件名轉(zhuǎn)換成GBK文件名
//                if (PHP_OS != 'WINNT') {
//                    $file_name = mb_convert_encoding($file_name, 'gbk', 'utf-8'); // 把文件名從utf-8轉(zhuǎn)換為gbk
//                }
//            $file_name = mb_convert_encoding($file_name, 'gbk', 'utf-8'); // 把文件名從utf-8轉(zhuǎn)換為gbk

            // 下載文件
            $ch = curl_init();
            curl_setopt($ch,CURLOPT_URL,$val);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
            $data = curl_exec($ch);
            error_log(var_export(curl_getinfo($ch), 1));
            curl_close($ch);
            if ($data) {
                // 保存文件
                file_put_contents($dir.$file_name, $data);
            }
        }
    }

    // 壓縮文件
    // $dir 掃描目錄
    // $filename 壓縮文件名
    public function compress($dir, $filename = false){
        if (!file_exists($dir)) {
            return false;
        }

        $file_lists = scandir($dir); // 掃描文件夾
        $file_lists = array_diff($file_lists, ['.', '..']); //去除上級目錄和當(dāng)前目錄
        if (empty($file_lists)) {
            return false;
        }

        if (!$filename) {
            $filename = time().rand(111, 999).'.zip';
        } else {
            $filename .= '.zip';
        }

        $fullname = $dir.$filename; // 帶路徑的壓縮文件名
        if (!file_exists($fullname)) {
            $zip = new ZipArchive();
            if ($zip->open($fullname, ZipArchive::CREATE)==TRUE) {
                foreach($file_lists as $val){
                    if(file_exists($dir.$val)){
                        $zip->addFile($dir.$val, $val);
                    }
                }
                $zip->close();
            }
        }
        return $filename;
    }

    // 遞歸刪除文件和文件夾
    // $path 要刪除的文件路徑
    public function deleteDir($path)
    {
        //如果是目錄則繼續(xù)
        if (is_dir($path)) {
            $file_lists = scandir($path);//掃描一個(gè)文件夾內(nèi)的所有文件夾和文件并返回?cái)?shù)組
            foreach ($file_lists as $val) {//排除目錄中的.和..
                if ($val != "." && $val != "..") {//如果是目錄則遞歸子目錄,繼續(xù)操作
                    if (is_dir($path . $val)) {//子目錄中操作刪除文件夾和文件
                        self::deleteDir($path . $val . '/');//目錄清空后刪除空文件夾
                        @rmdir($path . $val . '/');
                    } else {//如果是文件直接刪除
                        unlink($path . $val);
                    }
                }
            }
            @rmdir($path);
        }
    }
}

關(guān)于php下載遠(yuǎn)程文件的源碼是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI