在 PHP5 中上传图片
upload image in PHP5
我在 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!";
}
?>
有人可以帮我吗?
一些评论。
此路径必须有写入权限。
$destino = 'images/uploads/logos/' . $novoNome;
同时检查您的表单是否包含
enctype="multipart/form-data"
您正在检查 .
之后的字符串是否与您接受的扩展匹配。就像我在评论部分提到的那样,用户可以轻松更改文件的扩展名并上传它,而不管内容是什么。
PHP.net上有一个article/comment是关于如何上传文件的,一些安全问题也用代码简单说明并解决了。我认为这部分适合你:
// 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 错误:
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
语句中的error suppression@
。如果有任何失败,您将看不出原因。
所以我认为这可以节省您的时间,并以安全的方式解决您的问题。
祝你好运。
我在 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!";
}
?>
有人可以帮我吗?
一些评论。
此路径必须有写入权限。
$destino = 'images/uploads/logos/' . $novoNome;
同时检查您的表单是否包含
enctype="multipart/form-data"
您正在检查 .
之后的字符串是否与您接受的扩展匹配。就像我在评论部分提到的那样,用户可以轻松更改文件的扩展名并上传它,而不管内容是什么。
PHP.net上有一个article/comment是关于如何上传文件的,一些安全问题也用代码简单说明并解决了。我认为这部分适合你:
// 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 错误:
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
语句中的error suppression@
。如果有任何失败,您将看不出原因。
所以我认为这可以节省您的时间,并以安全的方式解决您的问题。 祝你好运。