首页 文章

使用curl替代fgetcsv的fopen文件资源

提问于
浏览
7

是否可以进行curl,访问URL和结果作为文件资源?喜欢fopen怎么做 .

我的目标:

  • 解析CSV文件

  • 将其传递给fgetcsv

我的阻挠:fopen被禁用

我的一大堆代码(fopen)

$url = "http://download.finance.yahoo.com/d/quotes.csv?s=USDEUR=X&f=sl1d1t1n&e=.csv";
$f = fopen($url, 'r');
print_r(fgetcsv($f));

然后,我正在尝试卷曲 .

$curl = curl_init();
curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
curl_setopt($curl, CURLOPT_URL, $url);
$content = @curl_exec($curl);
curl_close($curl);

但是,像往常一样 . $ content已经返回一个字符串 .

现在,curl有可能将其作为文件资源指针返回吗?就像fopen一样?使用PHP <5.1.x的东西 . 我的意思是,不使用str_getcsv,因为它只有5.3 .

我的错误

警告:fgetcsv()期望参数1是资源,给定布尔值

谢谢

2 回答

  • 0

    假设 fopen is disabled 表示“ allow_url_fopen 已禁用”, CURLOPT_FILEphp://temp的组合使这相当容易:

    $f = fopen('php://temp', 'w+');
    
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_FILE, $f);
    // Do you need these? Your fopen() method isn't a post request
    // curl_setopt($curl, CURLOPT_POST, true);
    // curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
    curl_exec($curl);
    curl_close($curl);
    
    rewind($f);
    
    while ($line = fgetcsv($f)) {
      print_r($line);
    }
    
    fclose($f);
    

    基本上这会创建一个指向"virtual"文件的指针,而cURL会将响应存储在其中 . 然后你只需将指针重置为开头,可以将其视为像往常一样用 fopen($url, 'r'); 打开它

  • 11

    您可以使用 fopen() 创建临时文件,然后将内容 fwrite() 创建到其中 . 之后, fgetcsv() 将可读取新创建的文件 . tempnam()函数应该处理任意临时文件的创建 .

    根据对str_getcsv()的评论,无法访问该命令的用户可以尝试以下功能 . 评论中还有其他各种方法,请务必查看 .

    function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') {
        if (is_string($input) && !empty($input)) {
            $output = array();
            $tmp    = preg_split("/".$eol."/",$input);
            if (is_array($tmp) && !empty($tmp)) {
                while (list($line_num, $line) = each($tmp)) {
                    if (preg_match("/".$escape.$enclosure."/",$line)) {
                        while ($strlen = strlen($line)) {
                            $pos_delimiter       = strpos($line,$delimiter);
                            $pos_enclosure_start = strpos($line,$enclosure);
                            if (
                                is_int($pos_delimiter) && is_int($pos_enclosure_start)
                                && ($pos_enclosure_start < $pos_delimiter)
                                ) {
                                $enclosed_str = substr($line,1);
                                $pos_enclosure_end = strpos($enclosed_str,$enclosure);
                                $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end);
                                $output[$line_num][] = $enclosed_str;
                                $offset = $pos_enclosure_end+3;
                            } else {
                                if (empty($pos_delimiter) && empty($pos_enclosure_start)) {
                                    $output[$line_num][] = substr($line,0);
                                    $offset = strlen($line);
                                } else {
                                    $output[$line_num][] = substr($line,0,$pos_delimiter);
                                    $offset = (
                                                !empty($pos_enclosure_start)
                                                && ($pos_enclosure_start < $pos_delimiter)
                                                )
                                                ?$pos_enclosure_start
                                                :$pos_delimiter+1;
                                }
                            }
                            $line = substr($line,$offset);
                        }
                    } else {
                        $line = preg_split("/".$delimiter."/",$line);
    
                        /*
                         * Validating against pesky extra line breaks creating false rows.
                         */
                        if (is_array($line) && !empty($line[0])) {
                            $output[$line_num] = $line;
                        } 
                    }
                }
                return $output;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    

相关问题