【问题标题】:PHP upload file to database not working with gif, jpeg and other filetypesPHP 将文件上传到数据库不适用于 gif、jpeg 和其他文件类型
【发布时间】:2012-03-04 06:29:55
【问题描述】:

我遇到了一些 PHP/MySQL 无法正常工作的问题。我可以完美地上传 .docx 和 .sql 之类的文件,但是当我尝试使用 .gif、.jpg .zip 和 .rar 时,它不起作用。

上传表单代码如下:

<?php 
if (isset($_GET['uploadError']))
{
    echo '<div id="error">There was an error uploading the file. Please try again</div>';
}
elseif ((!isset($_SESSION['dbusername']))&&(!isset($_SESSION['dbpassword'])))
{
    header('Location: ?page=login&uploadAttempt=true&attemptedSite=upload');
}
else
{
    echo '
    <center>
    <form class="form" enctype="multipart/form-data" action="uploadaction.php" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="30720" />
    <p class="uploadfile">
        <input name="uploadedfile" type="file" />
    </p>
    <p class="submit">
        <input type="hidden" name="upload" value="start" />
        <input type="submit" value="Upload File" />
    </p>
    </form></center>';
}
?>

这里是uploadaction.php代码:

    <?php
require('lib.php');
localhost_con('filehunt');
session_start();

if(isset($_POST['upload']) && $_FILES['uploadedfile']['size'] > 0)
{
    $fileName = $_FILES['uploadedfile']['name'];
    $tmpName  = $_FILES['uploadedfile']['tmp_name'];
    $fileSize = $_FILES['uploadedfile']['size'];
    $fileType = $_FILES['uploadedfile']['type'];

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

    if(!get_magic_quotes_gpc())
    {
        $fileName = addslashes($fileName);
    }
    /*$fh = fopen($_FILES['uploadedfile']['tmp_name'], 'r');
    $theData = fread($fh, filesize($_FILES['uploadedfile']['tmp_name']));
    $theData = mysql_real_escape_string($theData);
    fclose($fh); */
    $date = date("y/m/d : H:i:s", time());

    $sql = "INSERT INTO files (rowID, file, mimetype, data, uploaded_by, uploaded_date, size, times_downloaded) 
    VALUES (NULL, '$fileName', '$fileType', '$content', '$user', '$date', $fileSize, 0);";

    if (mysql_query($sql,$con))
    {
        header('Location: index.php?page=search&uploadSucces=true');
    } 
    else echo mysql_error();
}
else header('Location: index.php?page=upload&uploadError=true');

?>

它被插入到数据库中,但 mimetype 和 data 列是空的。 谁能告诉我为什么会这样,以及如何解决?

提前谢谢你 亚当

【问题讨论】:

  • 旁注:addslashes 不足以转义,您需要使用mysql_real_escape_string,并且您应该在每个header() 之后使用die()... 但总体而言+1 以获得代码,不会让我的眼睛流血。
  • 您好,谢谢!为什么我要在 header() 之后运行 die(),当它重定向远离脚本时?谢谢你,亚当
  • $fileName$fileSize输入成功了吗?
  • 检查您在数据库中输入的数据类型。

标签: php mysql file-upload blob


【解决方案1】:

我对其他类型的文件也有同样的问题。解决方法是使用传输更安全的 base64 对文件进行编码(不包含可能截断流的无效字符)。

【讨论】:

    【解决方案2】:

    不太确定,但是这个:

    $fileType = $_FILES['uploadedfile']['type'];
    

    必须是这样的:

    $finfo = new finfo();
    $fileType = $finfo->file($_FILES['uploadedfile']['tmp_name'], FILEINFO_MIME);
    

    【讨论】:

    • 嗨 user1207792,我试过了,但我的代码不太好用。我写了一些额外的代码来指定错误消息,所以我现在有了确切的错误消息。 MAX_FILE_SIZE 为 30720,我尝试上传的文件为 180 kb。我收到的错误消息是“值:2;上传的文件超出了 HTML 表单中指定的 MAX_FILE_SIZE 指令”,这很奇怪,因为我上传的文件小于 30mb
    • 您可以在您的 php.ini 中尝试此选项:upload_max_filesize = 10M post_max_size = 10M ... 或者您可以随意调整。
    • 嗯...我将upload_max_filesize更改为31457280字节,将post_max_size更改为31457280,但我仍然收到错误,但我认为错误来自HTML,即使我将max_file_size设置为30mb
    • 您的 html 表单中是否有任何限制/代码规范?喜欢&lt;input type="hidden" name="MAX_FILE_SIZE" value="12345"&gt;
    • 我看到了&lt;input type="hidden" name="MAX_FILE_SIZE" value="30720" /&gt; ...只需将此处的值增加到您需要的任何值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多