在 PHP5 中上传图片

问题描述 投票:0回答:2

我在 PHP 中有这段代码,用于将图像上传到目录。问题是:它没有上传 .png 文件。

错误:Você não enviou nenhum arquivo!

我不知道如何解决,已经尝试了很多改变。

 <?php
        //Upload de arquivos
        // verifica se foi enviado um arquivo
        if(isset($_FILES['arquivo']['name']) && $_FILES["arquivo"]["error"] == 0)
        {
            echo "Você enviou o arquivo: <strong>" . $_FILES['arquivo']['name'] . "</strong><br />";
            echo "Este arquivo é do tipo: <strong>" . $_FILES['arquivo']['type'] . "</strong><br />";
            echo "Temporáriamente foi salvo em: <strong>" . $_FILES['arquivo']['tmp_name'] . "</strong><br />";
            echo "Seu tamanho é: <strong>" . $_FILES['arquivo']['size'] . "</strong> Bytes<br /><br />";

            $arquivo_tmp = $_FILES['arquivo']['tmp_name'];
            $nome = $_FILES['arquivo']['name'];

            // Pega a extensao
            $extensao = strrchr($nome, '.');

            // Converte a extensao para mimusculo
            $extensao = strtolower($extensao);

            // Somente imagens, .jpg;.jpeg;.gif;.png
            // Aqui eu enfilero as extesões permitidas e separo por ';'
            // Isso server apenas para eu poder pesquisar dentro desta String
            if(strstr('.jpg;.png;.gif;.jpeg', $extensao))
            {
                // Cria um nome único para esta imagem
                // Evita que duplique as imagens no servidor.
                $novoNome = md5(microtime()) . $extensao;

                // Concatena a pasta com o nome
                $destino = 'images/uploads/logos/' . $novoNome;

                // tenta mover o arquivo para o destino
                if( @move_uploaded_file( $arquivo_tmp, $destino  ))
                {
                    echo "Arquivo salvo com sucesso em : <strong>" . $destino . "</strong><br />";
                    echo '<img src="' . $destino . '" />';
                    echo '<META http-equiv="refresh" content="0;URL=/administracao">';
                    exit;
                }
                else
                    echo "Erro ao salvar o arquivo. Aparentemente você não tem permissão de escrita.<br />";
            }
            else
                echo "Você poderá enviar apenas arquivos .jpg, .jpeg, .gif e .png.";
        }
        else
        {
            echo "Você não enviou nenhum arquivo!";
        }
    ?>

有人可以帮助我吗?

php file-upload php-5.5
2个回答
0
投票

您正在检查

.
之后的字符串是否与您接受的扩展名匹配。就像我在评论部分提到的那样,用户可以轻松更改文件的扩展名并上传它,无论内容如何。

PHP.net上有一篇关于如何上传文件的文章/评论,一些安全问题也用代码简单解释并解决了。我认为这部分对你有用:

// 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 can replace this with a custom message if you want. 
                                                        // Either that or catch it in higher level
}

此代码的来源(PHP.net)

还要确保您的错误已启用,以便您可以发现任何 PHP 错误:

error_reporting(E_ALL);         // Report ALL errors once they occur
ini_set('display_errors', 1);   // Once they get reported, print them as HTML on your page

还有一个建议,删除 @

move_uploaded_file
语句中的
错误抑制
if
。如果有任何事情失败了,你不会明白为什么。

所以我认为这可以节省您的时间,并以安全的方式解决您的问题。 祝你好运。


0
投票

一些评论。

该路径必须有写权限。

$destino = 'images/uploads/logos/' . $novoNome;

另请检查您的表格是否有

enctype="multipart/form-data"
© www.soinside.com 2019 - 2024. All rights reserved.