为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕斯王 2023-10-15 10:45:09
我今天大部分时间都在这个状态,所以我通常会在迭代和使用键/值方面取得成功。这次看起来并不容易,在 php 文档和跟踪差异源之间来回运行,运气不好,但这已经是我来的时候了。因此,在这段代码中,我们检查 ../../uploads中的所有 *.torrent 文件并解析每个文件并保存为 BLOB => database。该代码运行得非常好,可以单独上传。因此,我决定将其全部循环在一起,并根据所有文件的 DB ID / FILE ID(全部匹配)将所有文件发送到数据库。所以那里的逻辑很简单。这是我的代码// Start parsing files => DB => LONGGLOBforeach (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 进行解析。
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

我自己又回答了一个。我必须停止在这里运行我的最后一个选择,无论如何,这对于那些需要它的人来说是解决方案。一小时后我得到了它,我衷心感谢 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()就是这里的答案。虽然其他方法也有效,但它们不如这种方法有效或合乎逻辑。它按预期完美运行。


查看完整回答
反对 回复 2023-10-15
  • 1 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信