图片上传表单在网络上不起作用

时间:2017-06-23 18:04:13

标签: php mysql database upload xampp

我有一个在我的本地主机上运行的基于HTML / PHP的站点(使用XAMPP)。但当我将它转移到实时服务器时,一部分不想工作..图像上传。 localhost和live上的数据库几乎完全相同。使用数据库的所有其他东西工作正常。我只是无法上传图片。

这是我用于上传的代码:

    <?php 
include 'includes/header.php';
    ?>
    <br /><br />
    <form action="image.php" method="POST" enctype="multipart/form-data">
        <input type="file" name="image">
        <br /><br />
        <input type="submit" name="submit" value="Upload">
    </form>

    <?php


        if(isset($_POST['submit']))
        {

        include 'includes/connection.php';

        $imageName = mysql_real_escape_string($_FILES["image"]["name"]);
        $imageData = mysql_real_escape_string(file_get_contents($_FILES["image"]["tmp_name"]));
        $imageType = mysql_real_escape_string($_FILES["image"]["type"]);

        if(substr($imageType,0,5) == "image")
        {
            mysql_query("INSERT INTO `blob` VALUES('','$imageName','$imageData' )");
            echo "Plaatje opgeslagen";
        }
        else{
            echo "alleen plaatjes";
        }
        }
        ?>      
</body>

对不起,对你们来说这似乎很草率!但我还在学习:)。稍微解释一下代码:

顶部是te形式。

然后我们得到提交

include连接正在运行,因为我们与数据库建立了连接。否则我们将无法访问该网站。

需要将查询插入名为''blob'的表中,其中包含以下字段:'id','name'和'image'。

所以奇怪的是,它适用于localhost而不是live。我希望有一个人可以帮助我。这是我关于stackoverflow的第一篇文章,如果我做错了什么或不寻常的让我知道我很愿意学习!谢谢!

2 个答案:

答案 0 :(得分:0)

在PHP 5.5.0中不推荐使用mysql_query()函数。要研究的新标准是PHP内置的PDO驱动程序。

此外,CertaiN的帖子目前位于http://php.net/manual/en/features.file-upload.php

  

您最好彻底检查$ _FILES结构和值。   以下代码绝对不会导致任何错误。

实施例:     

header('Content-Type: text/plain; charset=utf-8');

try {

// Undefined | Multiple Files | $_FILES Corruption Attack
// If this request falls under any of them, treat it invalid.
if (
    !isset($_FILES['upfile']['error']) ||
    is_array($_FILES['upfile']['error'])
) {
    throw new RuntimeException('Invalid parameters.');
}

// Check $_FILES['upfile']['error'] value.
switch ($_FILES['upfile']['error']) {
    case UPLOAD_ERR_OK:
        break;
    case UPLOAD_ERR_NO_FILE:
        throw new RuntimeException('No file sent.');
    case UPLOAD_ERR_INI_SIZE:
    case UPLOAD_ERR_FORM_SIZE:
        throw new RuntimeException('Exceeded filesize limit.');
    default:
        throw new RuntimeException('Unknown errors.');
}

// You should also check filesize here. 
if ($_FILES['upfile']['size'] > 1000000) {
    throw new RuntimeException('Exceeded filesize limit.');
}

// DO NOT TRUST $_FILES['upfile']['mime'] VALUE !!
// Check MIME Type by yourself.
$finfo = new finfo(FILEINFO_MIME_TYPE);
if (false === $ext = array_search(
    $finfo->file($_FILES['upfile']['tmp_name']),
    array(
        'jpg' => 'image/jpeg',
        'png' => 'image/png',
        'gif' => 'image/gif',
    ),
    true
)) {
    throw new RuntimeException('Invalid file format.');
}

// You should name it uniquely.
// DO NOT USE $_FILES['upfile']['name'] WITHOUT ANY VALIDATION !!
// On this example, obtain safe unique name from its binary data.
if (!move_uploaded_file(
    $_FILES['upfile']['tmp_name'],
    sprintf('./uploads/%s.%s',
        sha1_file($_FILES['upfile']['tmp_name']),
        $ext
    )
)) {
    throw new RuntimeException('Failed to move uploaded file.');
}

echo 'File is uploaded successfully.';

} catch (RuntimeException $e) {

echo $e->getMessage();

}

?>

他的代码贡献是我选择验证和存储文件的方式。请注意,不是将图像存储在数据库中,而是将其上传到名为uploads /

的文件中的服务器

然后,您可以将此文件路径存储在数据库列中,并在需要时检索它。

希望这有帮助。

答案 1 :(得分:0)

一些注意事项:

  • 您可能希望更新以使用mysqli或PDO_MYSQL,从PHP 7开始删除mysql功能。

  • 永远不要信任表单数据(例如$ _FILES [“image”] [“type”])它不可靠。

  • 可能需要检查图片大小,以便人们不会将大量图片上传到您的数据库中。

尝试更像这样的事情:

HTML:

<form action="image.php" method="post" enctype="multipart/form-data">
Select image to upload: <input type="file" name="imageUpload" id="imageUpload">
<input type="submit" value="Upload Image" name="submit">
</form>

PHP:

<?php
$imageTypes = ['png', 'jpg', 'gif'];
if($_POST["submit"] == 'Upload Image')
{
    $fileExt = pathinfo($_FILES['imageUpload']['tmp_name'], PATHINFO_EXTENSION);
    if(!in_array($fileExt, $imageTypes))
        throw new Exception("Invalid upload type we only accept: " . implode(", ", $imageTypes)).
    else
    {
        $imageStr = mysql_real_escape_string(file_get_contents($_FILES['imageUpload']['tmp_name']));
        $imgName = mysql_real_escape_string($_FILES["imageUpload"]["name"]);
        mysql_query("INSERT INTO `blob` VALUES('','$imgName','$imageStr' )");
    }
}

有关mysqli的更多信息:http://php.net/manual/en/book.mysqli.php

有关PDO_MYSQL的更多信息:http://php.net/manual/en/ref.pdo-mysql.php