【问题标题】:Storing file in database using C# and retrieving from PHP使用 C# 将文件存储在数据库中并从 PHP 中检索
【发布时间】:2012-08-15 22:29:09
【问题描述】:

我正在开发一个 c# 项目,在该项目中我将数据库中的文件存储到一个中等 blob 字段中,数据存储得很好,当我在 MySQL Workbench 中查看它时,文件中的每一行都显示在它自己的行上在数据库中,即相同的格式。

但是,当我从 PHP 中检索信息时,它似乎删除了新行并且所有内容都在同一行上。

下面是我用来在数据库中存储文件的代码。

using (ConnectDb db = new ConnectDb(appSettings))
                {
                    FileStream fileStream = new FileStream(logFile, FileMode.Open, FileAccess.Read);
                    long fileLength = fileStream.Length;
                    byte[] myData = new byte[fileLength];
                    fileStream.Read(myData, 0, System.Convert.ToInt32(fileLength));
                    fileStream.Close();

                    string fileSize = Common.convertBytesToMb(fileLength);
                    string query = "INSERT INTO logfile_history (LogFile, FileSize) VALUES (@file, @size)";
                    using (MySqlCommand cmd = new MySqlCommand(query, db.conn))
                    {
                        cmd.Parameters.AddWithValue("@file", myData);
                        cmd.Parameters.AddWithValue("@size", fileSize);
                        cmd.ExecuteNonQuery();
                    }
                }

当我从 PHP 获取文件时,新行被删除,下面是我用来从 PHP 数据库中的 Medium Blob 获取数据的代码。

$query = "SELECT * FROM logfile_history WHERE id='$id'";

    $result = mysql_query($query);
    if ($result)
    {
        echo "<table class=\"overview\">";
        echo "<tr>";
        echo "<th>Date</th>";
        echo "<th>Class/Method</th>";
        echo "<th>Message</th>";
        echo "</tr>";
        while ($myrow = mysql_fetch_array($result))
        {
            $logContent = $myrow['LogFile'];
            $splitContent = explode("\t", $logContent);
            $i = 0;
            $colCount = 0;
            while ($i < count($splitContent))
            {
                if ($colCount == 0)
                {
                    echo "<tr>";
                }
                echo "<td>" . $splitContent[$i] . "</td>";
                if ($colCount == 2)
                {
                    echo "</tr>";
                    $colCount = 0;
                }
                $i++;
                $colCount++;
            }
        }
        echo "</table>";

我正在拆分日志文件中的行,因为它是制表符分隔的,所以我按制表符拆分它以将其放入表中,但这是在我意识到所有内容都在同一行之前。

从数据库中检索数据时如何保留换行符。

感谢您提供的任何帮助。

【问题讨论】:

    标签: c# php mysql


    【解决方案1】:

    好的,我想你有一个如下所示的日志文件:

    时间戳 1 方法 1 消息 1 时间戳 2 方法 2 消息 2 时间戳 3 方法 3 消息 3

    ...上面的 4 个空格是一个制表符。

    这是多行,但一个字符串,它使用数据库中的 1 行。当您调用 PHP 的 explode 方法时,您正在做的是拆分选项卡上的字符串。所以它看起来像:

    echo $splitcontent
    #prints a list like ["Timestamp1", "Method1", "Message1\nTimestamp2", "Method2", "Message2\nTimestamp3","Method3", "Message3"]
    

    (如果那里的语法不好,那是因为我实际上并不了解 PHP。)

    保留了换行符,但请注意消息和时间戳如何在同一个列表元素中压缩在一起。

    您最终将其包装在一些 HTML 标记中。我想象你的 HTML 看起来有点像这样:

    <table class="overview">
    <tr>
        <th>Date</th>
        <th>Class/Method</th>
        <th>Message</th>
    </tr>
    <tr>
        <td>Timestamp1</td>
        <td>Method1</td>
        <td>Message1\nTimestamp2</td>
    </tr>
    <tr>
        <td>Method2</td>
        <td>Message2\nTimestamp3</td>
        <td>Method3</td>
    </tr>
    <tr>
        <td>Message3</td>
    </table>
    

    (显然,这是 HTML 的格式化版本。)

    显然,HTML 不会将这些换行符识别为空格以外的任何内容。而且你的表格的格式是乱七八糟的。

    无论如何,您需要解决的方法是从数据库中检索字符串后,您需要将其拆分为多行。我认为您的一些困惑的根源在于您似乎认为数据库中的一行对应于文本文件中的一行。它没有。您有一个包含多行的文本文件,该文件在日志中存储为一行。因此,您不需要遍历数据库结果中的行(也就是说,如果您的 ID 列是主键,它可能是)。相反,您应该编写如下内容:

    if ($logtext = mysql_fetch_array($result))
    {
        $loglines = explode("\n", $logtext)
        foreach($loglines as $line)
        {
            echo "<tr>"
            #explode on the tab characters and format each entry inside <td> tags
            echo "</tr>"
        }
    }
    

    再次重申,我不懂 PHP,如有语法错误,敬请见谅。

    底线:当您尝试将文件格式化为 HTML 时,您需要处理文件中的换行符,并且数据库不会帮助您格式化换行符。 ;-)

    【讨论】:

    • 感谢您的帮助,完全忘记了使用 \n 新行和 HTML 无法识别文件所需的文件
    【解决方案2】:

    如果要保留换行符和制表符等非 HTML 格式,则需要将包含这些字符的文本换行在 &lt;pre&gt;&lt;/pre&gt; 标记中:

    http://www.w3.org/TR/html401/struct/text.html#h-9.3.4

    【讨论】:

      【解决方案3】:

      使用 File.ReadAllLines 保留新行 http://msdn.microsoft.com/en-us/library/bsy4fhsa 为什么将文本文件存储为二进制文件?

      【讨论】:

        猜你喜欢
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多