猿问

PHP解析文件功能-保存到数据库

我今天大部分时间都在这个状态,所以我通常会在迭代和使用键/值方面取得成功。这次看起来并不容易,在 php 文档和跟踪差异源之间来回运行,运气不好,但这已经是我来的时候了。


因此,在这段代码中,我们检查 ../../uploads中的所有 *.torrent 文件并解析每个文件并保存为 BLOB => database。


该代码运行得非常好,可以单独上传。因此,我决定将其全部循环在一起,并根据所有文件的 DB ID / FILE ID(全部匹配)将所有文件发送到数据库。所以那里的逻辑很简单。


这是我的代码


// Start parsing files => DB => LONGGLOB

foreach (glob("../../uploads/*.torrent") as $filename) {

    

    // Match file ID with database ID (WHERE CLAUS)

    $fileid = str_replace('.torrent', '', $filename);

    $filename1 = str_replace('../../uploads/', '', $filename);

    

    $fp = fopen('../../uploads/'.$filename1, 'rb');

    //$fp = fopen($_FILES['torrent']['tmp_name'], 'rb');

    $data = '';

    while (!feof($fp)) {

        $data .= fread($fp, 8192);

    }

    fclose($fp);


    $arr = bdecode($data);

    if ($arr === false) {

        die('invalid torrent');

    }


    // TODO: more validity checks for torrent?

    

    if (!array_key_exists('info', $arr)) {

        die('invalid torrent');

    }


    $arr['info']['private'] = 1;


    $infobc = bencode($arr['info']);

    if ($infobc === false) {

        die('bencoding error');

    }


    $info_hash = sha1($infobc);

    $total_size = 0;


    if (array_key_exists('files', $arr['info'])) {

        foreach ($arr['info']['files'] as $file) {

            if (array_key_exists('length', $file)) {

                $total_size += $file['length'];

            }

        }

    } else if (array_key_exists('length', $arr['info'])) {

        $total_size += $arr['info']['length'];

    }

    

    $description = 'dsfsdfDESCR';

    $name = 'dsfsdfNAME';


    // BEncode data and send it to DB

    $data = bencode($arr);

    $an = array_key_exists('anonymous', $_POST);

}

我终于循环了每个文件。但现在的问题是它显示了第一个文件,但它没有继续并实际逐个文件解析(最低 ID => 最高 ID,无论顺序),从而产生雪球效应中的错误。


我已经做了很多次尝试,直到对 fopen() 第一个参数的抱怨,所以我修复了这个问题,现在它无法正确迭代。我相信这是我的逻辑,但我无法理解。


因此$data = bencode($arr)需要解析每个图元文件并将其发送,就像注释掉的上传表单($fp)一样完美。任何帮助表示赞赏。


我已经使用所有不同的方法列出了文件,这次是 blob 函数。如何迭代每个文件并解析它=>下一个文件?


评论部分完美运行。但我们需要根据每个文件 ID 进行解析。


慕斯王
浏览 81回答 1
1回答

catspeake

我自己又回答了一个。我必须停止在这里运行我的最后一个选择,无论如何,这对于那些需要它的人来说是解决方案。一小时后我得到了它,我衷心感谢 php.net!解决方案:if ($_SERVER['REQUEST_METHOD'] === 'POST') {    $dir = new DirectoryIterator('../../uploads');    foreach ($dir as $fileinfo) {        if (!$fileinfo->isDot()) {            $getthelist = $fileinfo->getFilename();            $fp         = fopen('../../uploads/' . $getthelist, 'rb');            $data       = '';            while (!feof($fp)) {                $data .= fread($fp, 8192);            }            fclose($fp);            $arr = bdecode($data);            if ($arr === false) {                die('invalid torrent');            }            if (!array_key_exists('info', $arr)) {                die('invalid torrent');            }            $arr['info']['private'] = 1;            $infobc                 = bencode($arr['info']);            if ($infobc === false) {                die('bencoding error');            }            $info_hash  = sha1($infobc);            $total_size = 0;            if (array_key_exists('files', $arr['info'])) {                foreach ($arr['info']['files'] as $file) {                    if (array_key_exists('length', $file)) {                        $total_size += $file['length'];                    }                }            } else if (array_key_exists('length', $arr['info'])) {                $total_size += $arr['info']['length'];            }            $fileid = str_replace('.torrent', '', $getthelist);            $data   = bencode($arr);            $an     = array_key_exists('anonymous', $_POST);            DB::run("UPDATE torrents SET data = :data, info_hash = :info_hash, size = :total_size WHERE torrent_id = :torrentid", array(                'data' => $data,                'info_hash' => $info_hash,                'total_size' => $total_size,                'torrentid' => $fileid            )) or die('db error');        }    }}DirectoryIterator()就是这里的答案。虽然其他方法也有效,但它们不如这种方法有效或合乎逻辑。它按预期完美运行。
随时随地看视频慕课网APP
我要回答