【问题标题】:php mysql download linkphp mysql 下载链接
【发布时间】:2012-05-24 14:31:15
【问题描述】:

在此页面上,用户从下拉列表中选择一些选项并收到可供下载的文件列表。下载每条记录旁边的超链接。当前,下载超链接下载的文件具有正确的文件名,因为它存在于数据库中,但文件内容不正确。更具体地说,似乎没有正确发送标头:文件的内容是来自 newpub_profile.php 的 html 标记

这是最新的代码:

newpub_profile.php

       $q = "SELECT upload_id, title, genre, length, created
        FROM upload
        WHERE genre = '$genre' AND length = '$length'
        ORDER BY created DESC, title DESC";


    $r = mysqli_query ($dbc, $q); // Run the query

    if($r)
    {
        // If it ran okay, display the records
        echo '<table align="center"
            cellspacing="3" cellpadding="3"
            width="75%">
           <tr><td align="left"><b>Title</b></td>
           <td align="left"><b>Genre</b></td>
           <td align="left"><b>Pages</b></td>
           <td align="left"><b>Submitted</b></td>
           <td align="left"><b>Download</b></td>';

        // Fetch and print all the records:

        while ($row = mysqli_fetch_array($r,MYSQLI_ASSOC))
        {
            echo '<tr><td align="left">' .
            $row['title'] . '</td><td align="left">'
            . $row['genre'] . '</td><td align="left">'
            . $row['length'] . '</td><td align="left">'
            . $row['created'] . '</td><td align="left">'
            //. $row['views'] . '</td><td align="left">'
            . "<a href='newpub_profile.php?id={$row['upload_id']}'>Download</a></td>" . '</td></tr>';
        }
        echo '</table>'; // Close the table

        mysqli_free_result ($r); // Free up the resources
    }
    else // If it did not run okay
    {
        // Public Message:

        echo '<p class="error">Your submissions could not be retrieved.  We
            apologize for any inconvenience.</p>';

        // Debugging message:

        echo '<p>' . mysqli_error($dbc) . '<br /><br />Query: ' . $q . '</p>';

    } // End of if ($r) IF.



}

//END DOWNLOAD HANDLER ******************************************************


    mysqli_close($dbc); // Close the database connection

?>
                    <?php

                    // Make sure an ID was passed DOWNLOAD HANDLER *******
if(isset($_GET['id'])) {
// Get the ID
    $id = intval($_GET['id']); var_dump($id);


    require_once ('../mysqli_connect.php'); //Connect to the db



        // Fetch the file information
        $downloadq = "
            SELECT `file_type`, `size`, `title`, 'content', 'upload_id'
            FROM `upload`
            WHERE `upload_id` =".$id;
        $result = mysqli_query ($dbc, $downloadq); // Run the query


        if($result) {
            // Make sure the result is valid
            if (mysqli_num_rows($result) > 0) {
            // Get the row
                $row = mysqli_fetch_assoc($result);
                //var_dump($row);

                // Print headers
                header("Content-Type: ". $row['type']);
                header("Content-Length: ". $row['size']);
               header("Content-Disposition: attachment; filename=". $row['title']);


                // Print data
                echo stripslashes($row['content']);
            }
            else {
                echo 'Error! No such ID.';
            }

            // Free the mysqli resources
            mysqli_free_result($result);
        }
        else {
            echo "Error! Query failed: <pre>{$dbc->error}</pre>";
        }
        mysqli_close($dbc);
    }

                    ?>

newupload_sql.php

        if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) //check membership level here*******************************************
{
  //------------------------------------------------------------------------------------------------
    //$membercheck = "SELECT membership, uploaded
                   // FROM user
                   // WHERE user_id =". $_SESSION['user_id'];  //gets membership level and upload count

   //-----------------------------------------------------------------------------------------------

    if($_FILES['userfile']['size'] > 2621440)
        die("File larger than 2.5MB");

       $mimeTypes = array('application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/msword');

    if (in_array($_FILES['userfile']['type'], $mimeTypes))
      {
$fileName = $_FILES['userfile']['name'];
$tmpName  = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
$oid = $_SESSION['user_id'];
$views = 0;


$fp      = fopen($fileName, 'r');
$content = fread($fp, filesize($fileName));
$content = addslashes($content);
fclose($fp);

//if(!get_magic_quotes_gpc())
//{
  //  $fileName = addslashes($fileName);
//}

$query = "INSERT INTO upload (title, file_type, size, content, length, genre, created, views, description, owner_id) ".
"VALUES ('$fileName', '$fileType','$fileSize', '$content', '$length', '$genre', NOW(), '$views', '$description', '$oid')";
$r = @mysqli_query ($dbc, $query); //Run the query. or die('Error, query failed');

if($r)
{

        require_once ('login_functions.php');
        $url = absolute_url ('newupload_thanks.php');
        header("Location: $url");
        exit();
}

            else //if it didnt run ok...
            {
                //Public message:
                echo '<h1>System Error</h1>
                <p class="error">You could not upload due to a system
                error.  We apologize.</p>';

                //debugging message:

                echo'<p>' . mysqli_error($dbc) . '<br /><br />Query: ' . $r .
                '</p>';

            } // End of ($r) IF. // File's OK
    }

}
  else
    {
        die("Wrong tile type: Use .doc, .docx or ONLY");

    }



}mysqli_close($dbc); //Close the database connection.
?>

【问题讨论】:

  • 单击我的表格中的下载链接会导致下载页面本身。例如:下载表出现在download.php中,点击“下载”应该下载我数据库中的文件,而不是下载download.php
  • " 超链接值为 $upload_id " ?您的代码中的任何地方都没有 $upload_id 。是否有可能您有错字或错误命名的变量或其他什么?无论如何,当你运行这个时,你会得到什么?
  • 正如@itachi 所说,删除所有@。这些是抑制错误。删除它们可能会给你你正在寻找的答案

标签: php mysql hyperlink download


【解决方案1】:

您确定它正在下载页面本身吗?从外观上看,您的问题是您没有正确构建标题。您的 SQL 查询和 var_dump 表明您正在获取 title,但您使用 name 作为下载报价的文件名(实际上使代码发送带有空文件名的标头。

我建议您验证您的代码是否使用了实际的列名。即:

header("Content-Disposition: attachment; filename=". $row['title']);

【讨论】:

  • 将 $row['name'] 更改为 $row['title'] - 现在我可以下载具有正确文件名的文件,在本例中为“css_file.doc”。当我打开文件时,它包含 newpub_profile.php 的 html
  • 使用您粘贴的代码,就好像您在无条件地创建 HTML 表格然后提供下载一样。如果您使用单独的文件,也许您可​​以编辑您的问题以显示每个文件上的代码
  • 谢谢,但仍不清楚哪个文件是哪个。我建议您为生成用户所在页面的输出的文件添加代码,以单击下载链接和他们登陆的页面的代码(您用于上传的页面似乎完全此处无关)
  • 问题的最顶部是表格回声。对于表中的每条记录,“下载”都显示为超链接。然后单击该链接。我相信我已经发布了除了我认为不相关的 HTML 之外我可以分享的所有内容。这里发生的是一个人登录并进入他们的个人资料,这种特定类型的人从几个复选框中选择选项,然后返回结果,并带有与每条记录对应的下载链接。下载链接 ID 链接到 $upload_id。我认为当前单击下载会导致标头发送错误
  • 下载的文件将包含 php 文件输出的所有内容。从您发布的代码的外观来看,您在下载标题之前无条件地输出 HTML。如果是这种情况,确实为您提供下载是没有意义的,但这就是我们可以从您发布的代码中看到的
【解决方案2】:

没有row['name'] 你的意思是row['title']

【讨论】:

  • 该更改现在允许我下载正确的文件名,但文件内容不正确。文件内容是 newpub_profile.php 的 html
【解决方案3】:

你有这些

$fileName = $_FILES['userfile']['name'];
$tmpName  = $_FILES['userfile']['tmp_name'];

您必须将 $tmpName 重命名/移动为 $filename

已编辑

检查这个 move_uploaded_file()

或在以下块中将 $fileName 更改为 $tmpName

$fp      = fopen($fileName, 'r');
$content = fread($fp, filesize($fileName));
$content = addslashes($content);
fclose($fp);

【讨论】:

  • 原来我有 fopen($tmpName, 'r'); ...然后切换到 $fileName。是否可以直接从 POST 上传并将其放在 mysql 中,或者我必须使用 move_uploaded_file() 将上传移动到临时目录,插入数据库,然后删除目录
  • 我没试过。我认为我永远不会将文件放入数据库。我建议创建一个唯一的文件名并将其存储在一个文件夹中,然后将链接存储到数据库中。这种方式效率更高。
猜你喜欢
  • 1970-01-01
  • 2015-09-06
  • 2016-08-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2011-12-24
相关资源
最近更新 更多