{"id":5307,"date":"2022-09-10T10:14:45","date_gmt":"2022-09-10T13:14:45","guid":{"rendered":"https:\/\/categoriaoutros.com.br\/?p=5307"},"modified":"2022-09-15T10:27:18","modified_gmt":"2022-09-15T13:27:18","slug":"php-trabalhando-com-envioupload-de-arquivos","status":"publish","type":"post","link":"https:\/\/categoriaoutros.com.br\/?p=5307","title":{"rendered":"PHP:\u00a0Trabalhando com Envio(upload) de arquivos"},"content":{"rendered":"\n<p>Nesse tutorial aprenderemos como criar um formul\u00e1rio para upload(envio) de arquivos e processar arquivos enviados com seguran\u00e7a em PHP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preparando o Formul\u00e1rio<\/h2>\n\n\n\n<p>Antes de tudo, o elemento <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">&lt;form&gt;<\/mark> tem que ter o atributo <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">enctype=&#8221;multipart\/form-data&#8221;<\/mark>.  Se n\u00e3o usar assim o navegador n\u00e3o poder\u00e1 fazer upload de arquivos.<\/p>\n\n\n\n<pre><font color=\"#2A7BDE\">&lt;form<\/font> <font color=\"#33C7DE\">enctype=<\/font><font color=\"#A2734C\">\"multipart\/form-data\"<\/font> <font color=\"#33C7DE\">action=<\/font><font color=\"#A2734C\">\"index.php\"<\/font> <font color=\"#33C7DE\">method=<\/font><font color=\"#A2734C\">\"post\"<\/font><font color=\"#2A7BDE\">&gt;<\/font>\n<font color=\"#2A7BDE\">&lt;\/form&gt;<\/font><\/pre>\n\n\n\n<p>Dentro do form acima usamos<strong> &lt;input&gt;<\/strong> com o<strong> type=&#8221;file&#8221;<\/strong>.<\/p>\n\n\n\n<pre><font color=\"#2A7BDE\">&lt;form<\/font> <font color=\"#33C7DE\">enctype=<\/font><font color=\"#A2734C\">\"multipart\/form-data\"<\/font> <font color=\"#33C7DE\">action=<\/font><font color=\"#A2734C\">\"index.php\"<\/font> <font color=\"#33C7DE\">method=<\/font><font color=\"#A2734C\">\"post\"<\/font><font color=\"#2A7BDE\">&gt;<\/font>\n  <font color=\"#2A7BDE\">&lt;input<\/font> <font color=\"#33C7DE\">type=<\/font><font color=\"#A2734C\">\"file\"<\/font> <font color=\"#33C7DE\">value=<\/font><font color=\"#A2734C\">\"\"<\/font> <font color=\"#33C7DE\">name=<\/font><font color=\"#A2734C\">\"Enviar\"<\/font><font color=\"#2A7BDE\">&gt;<\/font>\n<font color=\"#2A7BDE\">&lt;\/form&gt;<\/font>\n<\/pre>\n\n\n\n<p>Esse \u00e9 o resultado:<\/p>\n\n\n\n<form enctype=\"multipart\/form-data\" action=\"index.php\" method=\"post\">\n  <input type=\"file\" value=\"\" name=\"Enviar\">\n<\/form>\n\n\n\n<p>Se usarmos o atributo multiple poderemos selecionar mais de um arquivo para envio.<\/p>\n\n\n\n<pre><font color=\"#2A7BDE\">&lt;form<\/font> <font color=\"#33C7DE\">enctype=<\/font><font color=\"#A2734C\">\"multipart\/form-data\"<\/font> <font color=\"#33C7DE\">action=<\/font><font color=\"#A2734C\">\"index.php\"<\/font> <font color=\"#33C7DE\">method=<\/font><font color=\"#A2734C\">\"post\"<\/font><font color=\"#2A7BDE\">&gt;<\/font>\n  <font color=\"#2A7BDE\">&lt;input<\/font> <font color=\"#33C7DE\">type=<\/font><font color=\"#A2734C\">\"file\"<\/font> <font color=\"#33C7DE\">value=<\/font><font color=\"#A2734C\">\"\"<\/font> <font color=\"#33C7DE\">name=<\/font><font color=\"#A2734C\">\"enviar\"<\/font> <font color=\"#C01C28\"><u style=\"text-decoration-style:single\">multiple<\/u><\/font><font color=\"#2A7BDE\">&gt;<\/font>\n<font color=\"#2A7BDE\">&lt;\/form&gt;<\/font>\n<\/pre>\n\n\n\n<p>Para permitir que apenas certos tipos de arquivos, usamos o atributo <strong>accept<\/strong>, que pode ter os seguintes valores:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Uma extens\u00e3o de nome de arquivo:  <code>.jpg<\/code>,&nbsp;<code>.pdf<\/code>,&nbsp;<code>.txt<\/code> <\/li><li>Uma string de tipo MIME<\/li><li>ou <strong>image\/*<\/strong> para qualquer arquivo de imagem, <strong>video\/*<\/strong>  para qualquer arquivo de v\u00eddeo, <strong>audio\/*<\/strong> para qualquer arquivo de \u00e1udio.<\/li><\/ul>\n\n\n\n<pre><font color=\"#2A7BDE\">&lt;form<\/font> <font color=\"#33C7DE\">enctype=<\/font><font color=\"#A2734C\">\"multipart\/form-data\"<\/font> <font color=\"#33C7DE\">action=<\/font><font color=\"#A2734C\">\"index.php\"<\/font> <font color=\"#33C7DE\">method=<\/font><font color=\"#A2734C\">\"post\"<\/font><font color=\"#2A7BDE\">&gt;<\/font>\n  <font color=\"#2A7BDE\">&lt;input<\/font> <font color=\"#33C7DE\">type=<\/font><font color=\"#A2734C\">\"file\"<\/font> <font color=\"#33C7DE\">value=<\/font><font color=\"#A2734C\">\"\"<\/font> <font color=\"#33C7DE\">name=<\/font><font color=\"#A2734C\">\"enviar\"<\/font> <font color=\"#C01C28\"><u style=\"text-decoration-style:single\">multiple<\/u><\/font>  <font color=\"#33C7DE\">accept=<\/font><font color=\"#A2734C\">\"image\/jpeg, image\/png\"<\/font><font color=\"#2A7BDE\">&gt;<\/font>\n<font color=\"#2A7BDE\">&lt;\/form&gt;<\/font>\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Configura\u00e7\u00e3o para upload do arquivo PHP.INI<\/h2>\n\n\n\n<p>Acima vimos como preparar nosso formul\u00e1rio usando HTML. Aqui, no entanto, come\u00e7aremos a usar o arquivo php.ini do nosso PHP.<\/p>\n\n\n\n<p>O PHP tem algumas op\u00e7\u00f5es importantes que controlam o upload do arquivo. Essas op\u00e7\u00f5es est\u00e3o no arquivo php.ini. <\/p>\n\n\n\n<p>Se estiver usando o xampp no Windows possivelmente seu  php.ini estar\u00e1 em C:\\xampp\\php\\php.ini<\/p>\n\n\n\n<p>No Linux&nbsp;poder\u00e1 est\u00e1 em <em>\/etc\/php\/7.4\/apache2\/php.ini<\/em>  &#8211;  substitua 7.4 pela vers\u00e3o do seu PHP.<\/p>\n\n\n\n<p>Temos um artigo falando sobre a localiza\u00e7\u00e3o do php.ini: <a href=\"https:\/\/categoriaoutros.com.br\/?p=3696#:~:text=ONDE%20EST%C3%81%20O%20ARQUIVO%20PHP.INI%3F\">Onde est\u00e1 o php.ini?<\/a> <\/p>\n\n\n\n<p>Tamb\u00e9m podemos usar a fun\u00e7\u00e3o <strong>php_ini_loaded_file()<\/strong> para vermos a localiza\u00e7\u00e3o do arrquivo php.ini<\/p>\n\n\n\n<p>Abaixo est\u00e3o as op\u00e7\u00f5es importantes que encontramos dentro do php.ini referentes a envio(upload) de arquivos:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">; habilita uploads de arquivos HTTP.<\/mark><br>file_uploads=On<br><br><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">; Diret\u00f3rio tempor\u00e1rio para arquivos HTTP carregados (usar\u00e1 o padr\u00e3o do sistema se n\u00e3o ; Especificadas).<\/mark><br>upload_tmp_dir=&#8221;C:\\xampp\\tmp&#8221;<br><br><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">; Tamanho m\u00e1ximo permitido para arquivos enviados.<\/mark><br>upload_max_filesize=2M<br><br><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">; N\u00famero m\u00e1ximo de arquivos que podem ser enviados por meio de uma \u00fanica solicita\u00e7\u00e3o<\/mark><br>max_file_uploads=20<\/p>\n\n\n\n<p>Vamos falar sobre cada uma:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>file_uploads<\/strong>: A diretiva file_upload deve estar On para permitir o upload de arquivos. O padr\u00e3o \u00e9 Ativado.<\/li><li><strong>upload_max_filesize<\/strong>:  O upload_max_filesize especifica o tamanho m\u00e1ximo do arquivo a ser enviado. Por padr\u00e3o \u00e9 2M (MB). Se voc\u00ea receber um erro informando que o arquivo excede upload_max_filesize, ser\u00e1 necess\u00e1rio aumentar esse valor.<\/li><li><strong>upload_tmp_dir<\/strong>:  O upload_tmp_dir especifica o diret\u00f3rio que armazena os arquivos carregados temporariamente.<\/li><li><strong>post_max_size<\/strong>:  O post_max_size especifica o tamanho m\u00e1ximo dos dados POST. Como voc\u00ea far\u00e1 upload de arquivos com a solicita\u00e7\u00e3o POST, voc\u00ea precisa ter certeza de que o post_max_size \u00e9 maior que upload_max_size.<\/li><li><strong>max_file_uploads<\/strong>: A diretiva max_file_uploads limita o n\u00famero de arquivos que voc\u00ea pode enviar por vez.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Manipulando uploads de arquivos em PHP<\/h2>\n\n\n\n<p>Para acessar as informa\u00e7\u00f5es de um arquivo carregado, voc\u00ea usa o array $_FILES. Por exemplo, acima o nome para nosso input era &#8220;enviar&#8221;   &lt;input type=&#8221;file&#8221; <em>name=&#8221;enviar&#8221;<\/em>&gt;  <\/p>\n\n\n\n<p>Ent\u00e3o usamos $_FILES assim: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$_FILES['enviar']\n<\/pre>\n\n\n\n<p>O <strong>$_FILE[\u2018enviar\u2019] <\/strong>\u00e9 um <a href=\"https:\/\/categoriaoutros.com.br\/?p=4017#:~:text=5-,Array%20Associativo,-Arrays%20Associativos%20permitem\">array associativo<\/a> que consiste nas seguintes chaves:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>name<\/strong>: \u00e9 o nome do arquivo carregado.<\/li><li><strong>type<\/strong>: \u00e9 o tipo MIME do arquivo de upload, por exemplo, <em>imagem\/jpeg <\/em> para imagem JPEG ou <em>application\/pdf<\/em> para arquivo PDF.<\/li><li><strong>size<\/strong>: \u00e9 o tamanho do arquivo carregado em bytes.<\/li><li><strong>tmp_name<\/strong>: \u00e9 o arquivo tempor\u00e1rio no servidor que armazenou o nome do arquivo carregado. Se o arquivo carregado for muito grande, o tmp_name ser\u00e1 &#8220;<em>none<\/em>&#8220;.<\/li><li><strong>error<\/strong>: \u00e9 o c\u00f3digo de erro descrevendo o status do upload, por exemplo, <em>UPLOAD_ERR_OK<\/em> significa que o arquivo foi carregado com sucesso. Exemplos de status retornados: <br>UPLOAD_ERR_OK = Arquivo carregado com sucesso<br>UPLOAD_ERR_INI_SIZE = O arquivo \u00e9 muito grande para fazer upload<br>UPLOAD_ERR_FORM_SIZE = O arquivo \u00e9 muito grande para fazer upload<br>UPLOAD_ERR_PARTIAL =  O arquivo foi carregado apenas parcialmente<br>UPLOAD_ERR_NO_FILE =  Nenhum arquivo foi enviado&#8217;<br>UPLOAD_ERR_NO_FILE =&gt; Nenhum arquivo foi enviado&#8217;<br>UPLOAD_ERR_NO_TMP_DIR = Falta pasta tempor\u00e1ria no servidor<br>UPLOAD_ERR_CANT_WRITE = O arquivo falhou ao salvar no disco<br>UPLOAD_ERR_EXTENSION = Arquivo n\u00e3o permitido para upload para este servidor<br><\/li><\/ul>\n\n\n\n<p>Exemplo <em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">$_FILES[&#8216;enviar&#8217;][&#8216;error&#8217;]<\/mark><\/em> ir\u00e1 retornar o status.<\/p>\n\n\n\n<p>Quando um arquivo \u00e9 carregado com sucesso, ele \u00e9 armazenado em um diret\u00f3rio tempor\u00e1rio no servidor. E voc\u00ea pode usar a fun\u00e7\u00e3o <strong>move_uploaded_file() <\/strong>para mover o arquivo do diret\u00f3rio tempor\u00e1rio para outro.<\/p>\n\n\n\n<p>A fun\u00e7\u00e3o <strong>move_uploaded_file()<\/strong> aceita dois argumentos. Essa fun\u00e7\u00e3o aceita dos argumentos: <strong>nome do arquivo<\/strong> e o <strong>destino<\/strong>. <\/p>\n\n\n\n<p>O nome do arquivo pode ser representado por $_FILES[&#8216;enviar&#8217;][&#8216;tmp_name&#8217;]<\/p>\n\n\n\n<p>Destino \u00e9 a pasta para onde o arquivo ser\u00e1 movido.<\/p>\n\n\n\n<p>A fun\u00e7\u00e3o <em><strong>move_uploaded_file()<\/strong><\/em> retorna true se mover o arquivo com sucesso; caso contr\u00e1rio, ele retorna false.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Medidas de seguran\u00e7a<\/h2>\n\n\n\n<p>Todas as informa\u00e7\u00f5es na vari\u00e1vel <strong>$_FILES <\/strong>n\u00e3o podem ser confi\u00e1veis, exceto o tmp_name. Os hackers podem manipular o $_FILES e enviar o script malicioso para o servidor. Para evitar isso, voc\u00ea precisa validar as informa\u00e7\u00f5es no $_FILES:<\/p>\n\n\n\n<p>#1 verifique se o nome de entrada do arquivo est\u00e1 na vari\u00e1vel $_FILES usando o isset():<\/p>\n\n\n\n<pre>if(! isset($_FILES['enviar']) ) {\n   \/\/ error\n}\n<\/pre>\n\n\n\n<p>Acima, o &#8220;enviar&#8221; \u00e9 o nome do input.<\/p>\n\n\n\n<p>#2 verifique o tamanho real do arquivo usando a fun\u00e7\u00e3o filesize() e compare seu resultado com o tamanho m\u00e1ximo de arquivo permitido. Ele n\u00e3o deve confiar no tamanho fornecido pelo $_FILES. Por exemplo:<\/p>\n\n\n\n<pre>const MAX_SIZE  = 5 * 1024 * 1024; \/\/  5MB\n\nif (filesize($_FILES['file']['tmp_name']) &gt; MAX_SIZE) {\n   \/\/ error\n}\n<\/pre>\n\n\n\n<p>Lembre-se que MAX_SIZE n\u00e3o deve ser maior que upload_max_filesize especificado no php.ini.<\/p>\n\n\n\n<p>O tamanho de um arquivo est\u00e1 em bytes, o que n\u00e3o \u00e9 leg\u00edvel por humanos. Para torn\u00e1-lo mais leg\u00edvel, podemos definir uma fun\u00e7\u00e3o que converte os bytes em um formato leg\u00edvel por humanos.<\/p>\n\n\n\n<pre>function format_filesize(int $bytes, int $decimals = 2): string\n{\n    $units = 'BKMGTP';\n    $factor = floor((strlen($bytes) - 1) \/ 3);\n\n    return sprintf(\"%.{$decimals}f\", $bytes \/ pow(1024, $factor)) . $units[(int)$factor];\n}\n\n<\/pre>\n\n\n\n<p>#3 valide o tipo MIME do arquivo em rela\u00e7\u00e3o aos tipos de arquivo permitidos. Para fazer isso, voc\u00ea precisa definir uma lista de arquivos permitidos:<\/p>\n\n\n\n<pre>const ALLOWED_FILES = [\n   'image\/png' =&gt; 'png',\n   'image\/jpeg' =&gt; 'jpg'\n];\n<\/pre>\n\n\n\n<p>Para obter o tipo mime real de um arquivo, voc\u00ea usa tr\u00eas fun\u00e7\u00f5es: finfo_open(), finfo_file() e finfo_close():<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>finfo_open() <\/strong>retorna um novo recurso fileinfo<\/li><li><strong>finfo_file()<\/strong> retorna as informa\u00e7\u00f5es sobre o arquivo.<\/li><li><strong>finfo_close()<\/strong> fecha o recurso fileinfo.<\/li><\/ul>\n\n\n\n<p>Para torn\u00e1-lo f\u00e1cil e reutiliz\u00e1vel, voc\u00ea pode definir uma fun\u00e7\u00e3o get_mime_type() assim:<\/p>\n\n\n\n<pre>function get_mime_type(string $filename)\n{\n    $info = finfo_open(FILEINFO_MIME_TYPE);\n    if (!$info) {\n        return false;\n    }\n\n    $mime_type = finfo_file($info, $filename);\n    finfo_close($info);\n\n    return $mime_type;\n}\n\n<\/pre>\n\n\n\n<p>A fun\u00e7\u00e3o get_mime_type() acima aceita um nome de arquivo e retorna o tipo MIME do arquivo. Ele retornar\u00e1 false se ocorrer um erro. a Internet Assigned Numbers Authority (IANA) \u00e9 respons\u00e1vel por todos os tipos MIME oficiais, e voc\u00ea pode encontrar a lista completa na <a href=\"https:\/\/www.iana.org\/assignments\/media-types\/media-types.xhtml\">MIME type page<\/a>.<\/p>\n\n\n\n<p>Se ocorrer um erro ou a valida\u00e7\u00e3o falhar, voc\u00ea poder\u00e1 definir uma mensagem flash e redirecionar o navegador de volta para a p\u00e1gina de upload. A fun\u00e7\u00e3o a seguir define uma mensagem flash e executa um redirecionamento:<\/p>\n\n\n\n<pre>function redirect_with_message(string $message, string $type=FLASH_ERROR, string $name='upload', string $location='index.php'): void\n{\n    flash($name, $message, $type);\n    header(\"Location: $location\", true, 303);\n    exit;\n}\n<\/pre>\n\n\n\n<p>Observe que usamos a fun\u00e7\u00e3o flash() definida no arquivo flash.php. A fun\u00e7\u00e3o flash() mostra uma mensagem flash baseada em sess\u00e3o. Confira o tutorial <a href=\"https:\/\/categoriaoutros.com.br\/?p=4700\">de mensagem flash aqui<\/a>.<\/p>\n\n\n\n<p>Veja a seguir como usar a fun\u00e7\u00e3o redirection_with_message():<\/p>\n\n\n\n<pre>if(error) {\n   redirect_with_message('An error occurred');\n}\n<\/pre>\n\n\n\n<p>A instru\u00e7\u00e3o return encerra o script atual. <\/p>\n\n\n\n<p>Como todas essas fun\u00e7\u00f5es get_mime_type(), format_filesize() e redirect_with_message() s\u00e3o reutiliz\u00e1veis, voc\u00ea pode adicion\u00e1-las ao arquivo functions.php assim:<\/p>\n\n\n\n<pre><font color=\"#33C7DE\">&lt;?php<\/font>\n\n<font color=\"#A2734C\">\/**<\/font>\n<font color=\"#A2734C\"> *  Messages associated with the upload error code<\/font>\n<font color=\"#A2734C\"> *\/<\/font>\n<font color=\"#2A7BDE\">const<\/font> <font color=\"#F66151\">MESSAGES<\/font> = [\n    UPLOAD_ERR_OK =&gt; <font color=\"#A2734C\">'File uploaded successfully'<\/font>,\n    UPLOAD_ERR_INI_SIZE =&gt; <font color=\"#A2734C\">'File is too big to upload'<\/font>,\n    UPLOAD_ERR_FORM_SIZE =&gt; <font color=\"#A2734C\">'File is too big to upload'<\/font>,\n    UPLOAD_ERR_PARTIAL =&gt; <font color=\"#A2734C\">'File was only partially uploaded'<\/font>,\n    UPLOAD_ERR_NO_FILE =&gt; <font color=\"#A2734C\">'No file was uploaded'<\/font>,\n    UPLOAD_ERR_NO_TMP_DIR =&gt; <font color=\"#A2734C\">'Missing a temporary folder on the server'<\/font>,\n    UPLOAD_ERR_CANT_WRITE =&gt; <font color=\"#A2734C\">'File is failed to save to disk.'<\/font>,\n    UPLOAD_ERR_EXTENSION =&gt; <font color=\"#A2734C\">'File is not allowed to upload to this server'<\/font>,\n];\n\n<font color=\"#A2734C\">\/**<\/font>\n<font color=\"#A2734C\"> * Return a mime type of file or false if an error occurred<\/font>\n<font color=\"#A2734C\"> *<\/font>\n<font color=\"#A2734C\"> * @param string $filename<\/font>\n<font color=\"#A2734C\"> * @return string | bool<\/font>\n<font color=\"#A2734C\"> *\/<\/font>\n<font color=\"#2A7BDE\">function<\/font> <font color=\"#33D17A\">get_mime_type<\/font>(string <font color=\"#F66151\">$filename<\/font>)\n{\n    <font color=\"#F66151\">$info<\/font> = <font color=\"#33C7DE\">finfo_open<\/font>(FILEINFO_MIME_TYPE);\n    <font color=\"#2A7BDE\">if<\/font> (!<font color=\"#F66151\">$info<\/font>) {\n        <font color=\"#2A7BDE\">return<\/font> <font color=\"#2A7BDE\">false<\/font>;\n    }\n\n    <font color=\"#F66151\">$mime_type<\/font> = <font color=\"#33C7DE\">finfo_file<\/font>(<font color=\"#F66151\">$info<\/font>, <font color=\"#F66151\">$filename<\/font>);\n    <font color=\"#33C7DE\">finfo_close<\/font>(<font color=\"#F66151\">$info<\/font>);\n\n    <font color=\"#2A7BDE\">return<\/font> <font color=\"#F66151\">$mime_type<\/font>;\n}\n\n<font color=\"#A2734C\">\/**<\/font>\n<font color=\"#A2734C\"> * Return a human-readable file size<\/font>\n<font color=\"#A2734C\"> *<\/font>\n<font color=\"#A2734C\"> * @param int $bytes<\/font>\n<font color=\"#A2734C\"> * @param int $decimals<\/font>\n<font color=\"#A2734C\"> * @return string<\/font>\n<font color=\"#A2734C\"> *\/<\/font>\n<font color=\"#2A7BDE\">function<\/font> <font color=\"#33D17A\">format_filesize<\/font>(int <font color=\"#F66151\">$bytes<\/font>, int <font color=\"#F66151\">$decimals<\/font> = <font color=\"#2A7BDE\">2<\/font>): string\n{\n    <font color=\"#F66151\">$units<\/font> = <font color=\"#A2734C\">'BKMGTP'<\/font>;\n    <font color=\"#F66151\">$factor<\/font> = <font color=\"#33C7DE\">floor<\/font>((<font color=\"#33C7DE\">strlen<\/font>(<font color=\"#F66151\">$bytes<\/font>) - <font color=\"#2A7BDE\">1<\/font>) \/ <font color=\"#2A7BDE\">3<\/font>);\n\n    <font color=\"#2A7BDE\">return<\/font> <font color=\"#33C7DE\">sprintf<\/font>(<font color=\"#A2734C\">\"%.{<\/font><font color=\"#F66151\">$decimals<\/font><font color=\"#A2734C\">}f\"<\/font>, <font color=\"#F66151\">$bytes<\/font> \/ <font color=\"#33C7DE\">pow<\/font>(<font color=\"#2A7BDE\">1024<\/font>, <font color=\"#F66151\">$factor<\/font>)) . <font color=\"#F66151\">$units<\/font>[(int)<font color=\"#F66151\">$factor<\/font>];\n}\n\n\n<font color=\"#A2734C\">\/**<\/font>\n<font color=\"#A2734C\"> * Redirect user with a session based flash message<\/font>\n<font color=\"#A2734C\"> * @param string $message<\/font>\n<font color=\"#A2734C\"> * @param string $type<\/font>\n<font color=\"#A2734C\"> * @param string $name<\/font>\n<font color=\"#A2734C\"> * @param string $location<\/font>\n<font color=\"#A2734C\"> * @return void<\/font>\n<font color=\"#A2734C\"> *\/<\/font>\n<font color=\"#2A7BDE\">function<\/font> <font color=\"#33D17A\">redirect_with_message<\/font>(string <font color=\"#F66151\">$message<\/font>, string <font color=\"#F66151\">$type<\/font>=FLASH_ERROR, string <font color=\"#F66151\">$name<\/font>=<font color=\"#A2734C\">'upload'<\/font>, string \n<font color=\"#F66151\">$location<\/font>=<font color=\"#A2734C\">'index.php'<\/font>): void\n{\n    flash(<font color=\"#F66151\">$name<\/font>, <font color=\"#F66151\">$message<\/font>, <font color=\"#F66151\">$type<\/font>);\n    <font color=\"#33C7DE\">header<\/font>(<font color=\"#A2734C\">\"Location: $location\"<\/font>, <font color=\"#2A7BDE\">true<\/font>, <font color=\"#2A7BDE\">303<\/font>);\n    <font color=\"#2A7BDE\">exit<\/font>;\n}\n\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Dica: Usando o campo Chamado MAX_FILE_SIZE no input<\/h2>\n\n\n\n<p>Se colocarmos um campo e dermos a ele o nome MAX_FILE_SIZE antes <em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">input  type=&#8221;file<\/mark><\/em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">&#8220;<\/mark>, o PHP usar\u00e1 esse valor em vez de upload_max_filesize para validar o tamanho do arquivo.<\/p>\n\n\n\n<p>Vamos a um exemplo.<\/p>\n\n\n\n<pre><font color=\"#2A7BDE\">&lt;form<\/font> <font color=\"#33C7DE\">enctype=<\/font><font color=\"#A2734C\">\"multipart\/form-data\"<\/font> <font color=\"#33C7DE\">action=<\/font><font color=\"#A2734C\">\"upload.php\"<\/font> <font color=\"#33C7DE\">method=<\/font><font color=\"#A2734C\">\"post\"<\/font><font color=\"#2A7BDE\">&gt;<\/font>\n    <font color=\"#2A7BDE\">&lt;div&gt;<\/font>\n        <font color=\"#2A7BDE\">&lt;label<\/font> <font color=\"#33C7DE\">for=<\/font><font color=\"#A2734C\">\"file\"<\/font><font color=\"#2A7BDE\">&gt;<\/font>Selecione um Arquivo:<font color=\"#2A7BDE\">&lt;\/label&gt;<\/font>\n        <font color=\"#2A7BDE\">&lt;input<\/font> <font color=\"#33C7DE\">type=<\/font><font color=\"#A2734C\">\"hidden\"<\/font> <font color=\"#33C7DE\">name=<\/font><font color=\"#A2734C\">\"MAX_FILE_SIZE\"<\/font> <font color=\"#33C7DE\">value=<\/font><font color=\"#A2734C\">\"10240\"<\/font><font color=\"#2A7BDE\">\/&gt;<\/font>\n        <font color=\"#2A7BDE\">&lt;input<\/font> <font color=\"#33C7DE\">type=<\/font><font color=\"#A2734C\">\"file\"<\/font> <font color=\"#33C7DE\">id=<\/font><font color=\"#A2734C\">\"file\"<\/font> <font color=\"#33C7DE\">name=<\/font><font color=\"#A2734C\">\"file\"<\/font><font color=\"#2A7BDE\">\/&gt;<\/font>\n    <font color=\"#2A7BDE\">&lt;\/div&gt;<\/font>\n    <font color=\"#2A7BDE\">&lt;div&gt;<\/font>\n        <font color=\"#2A7BDE\">&lt;button<\/font> <font color=\"#33C7DE\">type=<\/font><font color=\"#A2734C\">\"submit\"<\/font><font color=\"#2A7BDE\">&gt;<\/font>Upload<font color=\"#2A7BDE\">&lt;\/button&gt;<\/font>\n    <font color=\"#2A7BDE\">&lt;\/div&gt;<\/font>\n<font color=\"#2A7BDE\">&lt;\/form&gt;<\/font>\n<\/pre>\n\n\n\n<p>Acima, o MAX_FILE_SIZE \u00e9 10 KB. Se voc\u00ea carregar um arquivo maior que 10 KB, o PHP emitir\u00e1 um erro. No entanto, \u00e9 f\u00e1cil manipular esse campo, portanto, nunca confie nessa dica para fins de seguran\u00e7a.<\/p>\n\n\n\n<p>Note tamb\u00e9m que voc\u00ea n\u00e3o pode definir MAX_FILE_SIZE maior que a diretiva upload_max_filesize no arquivo php.ini.<\/p>\n\n\n\n<h2 class=\"has-text-align-center wp-block-heading\">Exemplo Completo de Envio de Arquivo em PHP<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Nossa estrutura de Arquivos<\/h2>\n\n\n\n<p>Teremos essa estrutura de pastas e arquivos<\/p>\n\n\n\n<pre>\u251c\u2500\u2500 inc\n|  \u251c\u2500\u2500 flash.php\n|  \u2514\u2500\u2500 functions.php\n\u251c\u2500\u2500 index.php\n\u251c\u2500\u2500 upload.php\n\u2514\u2500\u2500 uploads\n<\/pre>\n\n\n\n<p>Acima, <strong>inc<\/strong> \u00e9 uma pasta e dentro dela temos os arquivos <strong>flash.php <\/strong>e <strong>functions.php<\/strong><\/p>\n\n\n\n<p>Vamos ver o conte\u00fado que colocaremos dentro de cada arquivo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">index.php<\/h2>\n\n\n\n<p>adicione o seguinte formul\u00e1rio de upload de arquivo ao arquivo index.php:<\/p>\n\n\n\n<pre><font color=\"#33C7DE\">&lt;?php<\/font>\n<font color=\"#33C7DE\">session_start<\/font>();\n<font color=\"#2A7BDE\">require_once<\/font> <font color=\"#F66151\">__DIR__<\/font> . <font color=\"#A2734C\">'\/inc\/flash.php'<\/font>;\n<font color=\"#33C7DE\">?&gt;<\/font>\n<font color=\"#33C7DE\">&lt;!DOCTYPE html&gt;<\/font>\n&lt;<font color=\"#2A7BDE\">html<\/font> <font color=\"#33C7DE\">lang<\/font>=<font color=\"#A2734C\">\"pt\"<\/font>&gt;\n&lt;<font color=\"#2A7BDE\">head<\/font>&gt;\n    &lt;<font color=\"#2A7BDE\">meta<\/font> <font color=\"#33C7DE\">charset<\/font>=<font color=\"#A2734C\">\"UTF-8\"<\/font>\/&gt;\n    &lt;<font color=\"#2A7BDE\">meta<\/font> <font color=\"#33C7DE\">name<\/font>=<font color=\"#A2734C\">\"viewport\"<\/font> <font color=\"#33C7DE\">content<\/font>=<font color=\"#A2734C\">\"width=device-width, initial-scale=1.0\"<\/font>\/&gt;\n    &lt;<font color=\"#2A7BDE\">link<\/font> <font color=\"#33C7DE\">rel<\/font>=<font color=\"#A2734C\">\"stylesheet\"<\/font> <font color=\"#33C7DE\">href<\/font>=<font color=\"#A2734C\">\"\/app\/css\/style.css\"<\/font>\/&gt;\n    &lt;<font color=\"#2A7BDE\">title<\/font>&gt;Envio de Arquivos em PHP&lt;\/<font color=\"#2A7BDE\">title<\/font>&gt;\n&lt;\/<font color=\"#2A7BDE\">head<\/font>&gt;\n&lt;<font color=\"#2A7BDE\">body<\/font>&gt;\n\n<font color=\"#33C7DE\">&lt;?php<\/font> flash(<font color=\"#A2734C\">'upload'<\/font>) <font color=\"#33C7DE\">?&gt;<\/font>\n\n&lt;<font color=\"#2A7BDE\">main<\/font>&gt;\n    &lt;<font color=\"#2A7BDE\">form<\/font> <font color=\"#33C7DE\">enctype<\/font>=<font color=\"#A2734C\">\"multipart\/form-data\"<\/font> <font color=\"#33C7DE\">action<\/font>=<font color=\"#A2734C\">\"upload.php\"<\/font> <font color=\"#33C7DE\">method<\/font>=<font color=\"#A2734C\">\"post\"<\/font>&gt;\n        &lt;<font color=\"#2A7BDE\">div<\/font>&gt;\n            &lt;<font color=\"#2A7BDE\">label<\/font> <font color=\"#33C7DE\">for<\/font>=<font color=\"#A2734C\">\"arquivo\"<\/font>&gt;Selecione um Arquivo:&lt;\/<font color=\"#2A7BDE\">label<\/font>&gt;\n            &lt;<font color=\"#2A7BDE\">input<\/font> <font color=\"#33C7DE\">type<\/font>=<font color=\"#A2734C\">\"file\"<\/font> <font color=\"#33C7DE\">id<\/font>=<font color=\"#A2734C\">\"arquivo\"<\/font> <font color=\"#33C7DE\">name<\/font>=<font color=\"#A2734C\">\"arquivo\"<\/font>\/&gt;\n        &lt;\/<font color=\"#2A7BDE\">div<\/font>&gt;\n        &lt;<font color=\"#2A7BDE\">div<\/font>&gt;\n            &lt;<font color=\"#2A7BDE\">button<\/font> <font color=\"#33C7DE\">type<\/font>=<font color=\"#A2734C\">\"submit\"<\/font>&gt;Enviar&lt;\/<font color=\"#2A7BDE\">button<\/font>&gt;\n        &lt;\/<font color=\"#2A7BDE\">div<\/font>&gt;\n    &lt;\/<font color=\"#2A7BDE\">form<\/font>&gt;\n&lt;\/<font color=\"#2A7BDE\">main<\/font>&gt;\n&lt;\/<font color=\"#2A7BDE\">body<\/font>&gt;\n&lt;\/<font color=\"#2A7BDE\">html<\/font>&gt;<\/pre>\n\n\n\n<p>O arquivo index.php tamb\u00e9m cont\u00e9m um formul\u00e1rio para fazer upload de um arquivo. O arquivo upload.php tratar\u00e1 do upload.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">upload.php<\/h2>\n\n\n\n<p>adicione o seguinte c\u00f3digo ao arquivo upload.php para processar o arquivo carregado:<\/p>\n\n\n\n<pre><font color=\"#33C7DE\">&lt;?php<\/font>\n\n<font color=\"#33C7DE\">session_start<\/font>();\n\n<font color=\"#2A7BDE\">require_once<\/font> <font color=\"#F66151\">__DIR__<\/font> . <font color=\"#A2734C\">'\/inc\/flash.php'<\/font>;\n<font color=\"#2A7BDE\">require_once<\/font> <font color=\"#F66151\">__DIR__<\/font> . <font color=\"#A2734C\">'\/inc\/functions.php'<\/font>;\n\n<font color=\"#2A7BDE\">const<\/font> <font color=\"#F66151\">ARQUIVOS_PERMITIDOS<\/font> = [\n    <font color=\"#A2734C\">'image\/png'<\/font> =&gt; <font color=\"#A2734C\">'png'<\/font>,\n    <font color=\"#A2734C\">'image\/jpeg'<\/font> =&gt; <font color=\"#A2734C\">'jpg'<\/font>\n];\n\n<font color=\"#2A7BDE\">const<\/font> <font color=\"#F66151\">MAX_SIZE<\/font> = <font color=\"#2A7BDE\">5<\/font> * <font color=\"#2A7BDE\">1024<\/font> * <font color=\"#2A7BDE\">1024<\/font>; \/\/  5MB\n\n<font color=\"#2A7BDE\">const<\/font> <font color=\"#F66151\">UPLOAD_DIR<\/font> = <font color=\"#F66151\">__DIR__<\/font> . <font color=\"#A2734C\">'\/uploads'<\/font>;\n\n\n<font color=\"#F66151\">$is_post_request<\/font> = <font color=\"#33C7DE\">strtolower<\/font>(<font color=\"#F66151\">$_SERVER<\/font>[<font color=\"#A2734C\">'REQUEST_METHOD'<\/font>]) === <font color=\"#A2734C\">'post'<\/font>;  \/\/ o m\u00e9todo \u00e9 post?\n<font color=\"#F66151\">$has_file<\/font> = <font color=\"#33C7DE\">isset<\/font>(<font color=\"#F66151\">$_FILES<\/font>[<font color=\"#A2734C\">'file'<\/font>]);   \/\/has_file significa \"existe arquivo?\" \n\n<font color=\"#2A7BDE\">if<\/font> (!<font color=\"#F66151\">$is_post_request<\/font> || !<font color=\"#F66151\">$has_file<\/font>) {\n    redirect_with_message(<font color=\"#A2734C\">'Opera\u00e7\u00e3o de Envio Inv\u00e1lida'<\/font>, FLASH_ERROR);\n}\n\n<font color=\"#0F0D16\">\/\/<\/font>\n<font color=\"#F66151\">$status<\/font> = <font color=\"#F66151\">$_FILES<\/font>[<font color=\"#A2734C\">'file'<\/font>][<font color=\"#A2734C\">'error'<\/font>];\n<font color=\"#F66151\">$filename<\/font> = <font color=\"#F66151\">$_FILES<\/font>[<font color=\"#A2734C\">'file'<\/font>][<font color=\"#A2734C\">'name'<\/font>];\n<font color=\"#F66151\">$tmp<\/font> = <font color=\"#F66151\">$_FILES<\/font>[<font color=\"#A2734C\">'file'<\/font>][<font color=\"#A2734C\">'tmp_name'<\/font>];\n\n\n<font color=\"#0F0D16\">\/\/  ocorrencia de  erros<\/font>\n<font color=\"#2A7BDE\">if<\/font> (<font color=\"#F66151\">$status<\/font> !== UPLOAD_ERR_OK) {\n    redirect_with_message(<font color=\"#F66151\">$messages<\/font>[<font color=\"#F66151\">$status<\/font>], FLASH_ERROR);\n}\n\n<font color=\"#0F0D16\">\/\/ validar tamanho do arquivo<\/font>\n<font color=\"#F66151\">$filesize<\/font> = <font color=\"#33C7DE\">filesize<\/font>(<font color=\"#F66151\">$tmp<\/font>);\n<font color=\"#2A7BDE\">if<\/font> (<font color=\"#F66151\">$filesize<\/font> &gt; MAX_SIZE) {\n    redirect_with_message(<font color=\"#A2734C\">'Erro! o tamanho do arquivo '<\/font> . format_filesize(<font color=\"#F66151\">$filesize<\/font>) . <font color=\"#A2734C\">' , e maior que o permitido '<\/font> . \nformat_filesize(MAX_SIZE), FLASH_ERROR);\n}\n\n<font color=\"#0F0D16\">\/\/ validate o tipo do arquivo<\/font>\n<font color=\"#F66151\">$mime_type<\/font> = get_mime_type(<font color=\"#F66151\">$tmp<\/font>);\n<font color=\"#2A7BDE\">if<\/font> (!<font color=\"#33C7DE\">in_array<\/font>(<font color=\"#F66151\">$mime_type<\/font>, <font color=\"#33C7DE\">array_keys<\/font>(ALLOWED_FILES))) {\n    redirect_with_message(<font color=\"#A2734C\">'The file type is not allowed to upload'<\/font>, FLASH_ERROR);\n}\n<font color=\"#0F0D16\">\/\/ define o nome do arquivo como base  + extensao<\/font>\n<font color=\"#F66151\">$uploaded_file<\/font> = <font color=\"#33C7DE\">pathinfo<\/font>(<font color=\"#F66151\">$filename<\/font>, PATHINFO_FILENAME) . <font color=\"#A2734C\">'.'<\/font> . ALLOWED_FILES[<font color=\"#F66151\">$mime_type<\/font>];\n<font color=\"#0F0D16\">\/\/ novo local<\/font>\n<font color=\"#F66151\">$filepath<\/font> = UPLOAD_DIR . <font color=\"#A2734C\">'\/'<\/font> . <font color=\"#F66151\">$uploaded_file<\/font>;\n\n<font color=\"#0F0D16\">\/\/ mova para o diretorio  upload<\/font>\n<font color=\"#F66151\">$success<\/font> = <font color=\"#33C7DE\">move_uploaded_file<\/font>(<font color=\"#F66151\">$tmp<\/font>, <font color=\"#F66151\">$filepath<\/font>);\n<font color=\"#2A7BDE\">if<\/font> (<font color=\"#F66151\">$success<\/font>) {\n    redirect_with_message(<font color=\"#A2734C\">'O arquivo foi Enviado com Sucesso.'<\/font>, FLASH_SUCCESS);\n}\n\nredirect_with_message(<font color=\"#A2734C\">'Erro ao mover arquivo para pasta .'<\/font>, FLASH_ERROR);\n<\/pre>\n\n\n\n<p>Como upload.php funciona? Vamos explicar trechos dele:<\/p>\n\n\n\n<p>#1 ele Inicia uma sess\u00e3o e inclui os arquivos flash.php e functions.php para usar as fun\u00e7\u00f5es desses.<\/p>\n\n\n\n<pre><font color=\"#33C7DE\">session_start<\/font>();\n\n<font color=\"#2A7BDE\">require_once<\/font> <font color=\"#F66151\">__DIR__<\/font> . <font color=\"#A2734C\">'\/inc\/flash.php'<\/font>;\n<font color=\"#2A7BDE\">require_once<\/font> <font color=\"#F66151\">__DIR__<\/font> . <font color=\"#A2734C\">'\/inc\/functions.php'<\/font>;<\/pre>\n\n\n\n<p>#2 Define um array que especifica os arquivos permitidos:<\/p>\n\n\n\n<pre><font color=\"#2A7BDE\">const<\/font> <font color=\"#F66151\">ARQUIVOS_PERMITIDOS<\/font> = [\n    <font color=\"#A2734C\">'image\/png'<\/font> =&gt; <font color=\"#A2734C\">'png'<\/font>,\n    <font color=\"#A2734C\">'image\/jpeg'<\/font> =&gt; <font color=\"#A2734C\">'jpg'<\/font>\n];\n<\/pre>\n\n\n\n<p>#3 Define uma constante que especifica o tamanho m\u00e1ximo do arquivo:<\/p>\n\n\n\n<pre><font color=\"#2A7BDE\">const<\/font> <font color=\"#F66151\">MAX_SIZE<\/font> = <font color=\"#2A7BDE\">5<\/font> * <font color=\"#2A7BDE\">1024<\/font> * <font color=\"#2A7BDE\">1024<\/font>; \/\/  5MB<\/pre>\n\n\n\n<p>#4 Define o diret\u00f3rio de upload que armazena os arquivos enviados:<\/p>\n\n\n\n<pre><font color=\"#2A7BDE\">const<\/font> <font color=\"#F66151\">UPLOAD_DIR<\/font> = <font color=\"#F66151\">__DIR__<\/font> . <font color=\"#A2734C\">'\/uploads'<\/font>;<\/pre>\n\n\n\n<p>#5 Retorna uma mensagem de erro se o m\u00e9todo de solicita\u00e7\u00e3o n\u00e3o for POST ou o arquivo n\u00e3o existir na vari\u00e1vel $_FILES:<\/p>\n\n\n\n<pre><font color=\"#F66151\">$is_post_request<\/font> = <font color=\"#33C7DE\">strtolower<\/font>(<font color=\"#F66151\">$_SERVER<\/font>[<font color=\"#A2734C\">'REQUEST_METHOD'<\/font>]) === <font color=\"#A2734C\">'post'<\/font>;  \/\/ o m\u00e9todo \u00e9 post?\n<font color=\"#F66151\">$has_file<\/font> = <font color=\"#33C7DE\">isset<\/font>(<font color=\"#F66151\">$_FILES<\/font>[<font color=\"#A2734C\">'file'<\/font>]);   \/\/has_file significa \"existe arquivo?\" \n\n<font color=\"#2A7BDE\">if<\/font> (!<font color=\"#F66151\">$is_post_request<\/font> || !<font color=\"#F66151\">$has_file<\/font>) {\n    redirect_with_message(<font color=\"#A2734C\">'Opera\u00e7\u00e3o de Envio Inv\u00e1lida'<\/font>, FLASH_ERROR);\n}\n<\/pre>\n\n\n\n<p>#6 Obt\u00e9m as informa\u00e7\u00f5es do arquivo carregado, incluindo erro, nome do arquivo e nome do arquivo tempor\u00e1rio:<\/p>\n\n\n\n<pre><font color=\"#F66151\">$status<\/font> = <font color=\"#F66151\">$_FILES<\/font>[<font color=\"#A2734C\">'file'<\/font>][<font color=\"#A2734C\">'error'<\/font>];\n<font color=\"#F66151\">$filename<\/font> = <font color=\"#F66151\">$_FILES<\/font>[<font color=\"#A2734C\">'file'<\/font>][<font color=\"#A2734C\">'name'<\/font>];\n<font color=\"#F66151\">$tmp<\/font> = <font color=\"#F66151\">$_FILES<\/font>[<font color=\"#A2734C\">'file'<\/font>][<font color=\"#A2734C\">'tmp_name'<\/font>];<\/pre>\n\n\n\n<p>#7 Retorne uma mensagem de erro se o upload do arquivo falhou:<\/p>\n\n\n\n<pre><font color=\"#2A7BDE\">if<\/font> (<font color=\"#F66151\">$status<\/font> !== UPLOAD_ERR_OK) {\n    redirect_with_message(<font color=\"#F66151\">$messages<\/font>[<font color=\"#F66151\">$status<\/font>], FLASH_ERROR);\n}\n<\/pre>\n\n\n\n<p>#8 Obtenha o tamanho do arquivo na pasta tempor\u00e1ria e compare-o com o MAX_SIZE. Se o tamanho do arquivo enviado for maior que MAX_SIZE, emita um erro:<\/p>\n\n\n\n<pre><font color=\"#0F0D16\">\/\/ validar tamanho do arquivo<\/font>\n<font color=\"#F66151\">$filesize<\/font> = <font color=\"#33C7DE\">filesize<\/font>(<font color=\"#F66151\">$tmp<\/font>);\n<font color=\"#2A7BDE\">if<\/font> (<font color=\"#F66151\">$filesize<\/font> &gt; MAX_SIZE) {\n    redirect_with_message(<font color=\"#A2734C\">'Erro! o tamanho do arquivo '<\/font> . format_filesize(<font color=\"#F66151\">$filesize<\/font>) . <font color=\"#A2734C\">' , e maior que o permitido '<\/font> . \nformat_filesize(MAX_SIZE), FLASH_ERROR);\n}\n<\/pre>\n\n\n\n<p>#9 Obtenha o tipo MIME e compare-o com o tipo MIME dos arquivos permitidos especificados no array ALLOWED_FILES; emitir um erro se a valida\u00e7\u00e3o falhar:<\/p>\n\n\n\n<pre><font color=\"#0F0D16\">\/\/ valide o tipo do arquivo<\/font>\n<font color=\"#F66151\">$mime_type<\/font> = get_mime_type(<font color=\"#F66151\">$tmp<\/font>);\n<font color=\"#2A7BDE\">if<\/font> (!<font color=\"#33C7DE\">in_array<\/font>(<font color=\"#F66151\">$mime_type<\/font>, <font color=\"#33C7DE\">array_keys<\/font>(ALLOWED_FILES))) {\n    redirect_with_message(<font color=\"#A2734C\">'The file type is not allowed to upload'<\/font>, FLASH_ERROR);\n}\n<\/pre>\n\n\n\n<p>#10 Construa um novo nome de arquivo concatenando(juntando) o nome de arquivo do arquivo carregado com a extens\u00e3o de arquivo v\u00e1lida.<\/p>\n\n\n\n<p>Observe que o pathinfo() retorna o nome do arquivo sem a extens\u00e3o:<\/p>\n\n\n\n<pre><font color=\"#0F0D16\">\/\/ define o nome do arquivo como base  + extensao<\/font>\n<font color=\"#F66151\">$uploaded_file<\/font> = <font color=\"#33C7DE\">pathinfo<\/font>(<font color=\"#F66151\">$filename<\/font>, PATHINFO_FILENAME) . <font color=\"#A2734C\">'.'<\/font> . ALLOWED_FILES[<font color=\"#F66151\">$mime_type<\/font>];<\/pre>\n\n\n\n<p>#11 Mova o arquivo do diret\u00f3rio tempor\u00e1rio para a pasta de upload e emita uma mensagem de erro ou sucesso dependendo do resultado da fun\u00e7\u00e3o move_uploaded_file():<\/p>\n\n\n\n<pre><font color=\"#0F0D16\">\/\/ novo local<\/font>\n<font color=\"#F66151\">$filepath<\/font> = UPLOAD_DIR . <font color=\"#A2734C\">'\/'<\/font> . <font color=\"#F66151\">$uploaded_file<\/font>;\n\n<font color=\"#0F0D16\">\/\/ mova para o diretorio  upload<\/font>\n<font color=\"#F66151\">$success<\/font> = <font color=\"#33C7DE\">move_uploaded_file<\/font>(<font color=\"#F66151\">$tmp<\/font>, <font color=\"#F66151\">$filepath<\/font>);\n<font color=\"#2A7BDE\">if<\/font> (<font color=\"#F66151\">$success<\/font>) {\n    redirect_with_message(<font color=\"#A2734C\">'O arquivo foi Enviado com Sucesso.'<\/font>, FLASH_SUCCESS);\n}\n\nredirect_with_message(<font color=\"#A2734C\">'Erro ao mover arquivo para pasta .'<\/font>, FLASH_ERROR);\n<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Hoje vimos como enviar(upload) um arquivo e movendo-o de uma pasta para outra, geralmente em servidores, computadores diferentes, remotos.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nesse tutorial aprenderemos como criar um formul\u00e1rio para upload(envio) de arquivos e processar arquivos enviados com seguran\u00e7a em PHP. Preparando o Formul\u00e1rio Antes de tudo, o elemento &lt;form&gt; tem que ter o atributo enctype=&#8221;multipart\/form-data&#8221;. Se n\u00e3o usar assim o navegador n\u00e3o poder\u00e1 fazer upload de arquivos. &lt;form enctype=&#8221;multipart\/form-data&#8221; action=&#8221;index.php&#8221; method=&#8221;post&#8221;&gt; &lt;\/form&gt; Dentro do form acima&#8230;<\/p>\n<p class=\"more-link-wrap\"><a href=\"https:\/\/categoriaoutros.com.br\/?p=5307\" class=\"more-link\">Read More<span class=\"screen-reader-text\"> &ldquo;PHP:\u00a0Trabalhando com Envio(upload) de arquivos&rdquo;<\/span> &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[82,16,1622],"tags":[2339,2334,2331,2338,2332,2337,2333,2335,2336],"class_list":["post-5307","post","type-post","status-publish","format-standard","hentry","category-cursos","category-informatica-dicas","category-php","tag-envio-de-arquivos-com-php","tag-file_uploads","tag-manipulando-uploads-de-arquivos","tag-max_file_uploads","tag-php-manipulando-uploads-de-arquivos","tag-post_max_size","tag-upload-de-arquivos-em-php","tag-upload_max_filesize","tag-upload_tmp_dir"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP:\u00a0Trabalhando com Envio(upload) de arquivos - Categoria Outros<\/title>\n<meta name=\"description\" content=\"Nesse tutorial aprenderemos como criar um formul\u00e1rio para upload(envio) de arquivos e processar arquivos enviados com seguran\u00e7a em PHP.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/categoriaoutros.com.br\/?p=5307\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP:\u00a0Trabalhando com Envio(upload) de arquivos - Categoria Outros\" \/>\n<meta property=\"og:description\" content=\"Nesse tutorial aprenderemos como criar um formul\u00e1rio para upload(envio) de arquivos e processar arquivos enviados com seguran\u00e7a em PHP.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/categoriaoutros.com.br\/?p=5307\" \/>\n<meta property=\"og:site_name\" content=\"Categoria Outros\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/categoriaoutros\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-10T13:14:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-15T13:27:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/categoriaoutros.com.br\/wp-content\/uploads\/2023\/08\/pinguim-paginas-padrao.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1022\" \/>\n\t<meta property=\"og:image:height\" content=\"722\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Categoria: Outros\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CategoriaOutros\" \/>\n<meta name=\"twitter:site\" content=\"@CategoriaOutros\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Categoria: Outros\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/categoriaoutros.com.br\/?p=5307#article\",\"isPartOf\":{\"@id\":\"https:\/\/categoriaoutros.com.br\/?p=5307\"},\"author\":{\"name\":\"Categoria: Outros\",\"@id\":\"https:\/\/categoriaoutros.com.br\/#\/schema\/person\/ba0f432708449436912bd6736864bb40\"},\"headline\":\"PHP:\u00a0Trabalhando com Envio(upload) de arquivos\",\"datePublished\":\"2022-09-10T13:14:45+00:00\",\"dateModified\":\"2022-09-15T13:27:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/categoriaoutros.com.br\/?p=5307\"},\"wordCount\":1704,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/categoriaoutros.com.br\/#organization\"},\"keywords\":[\"envio de arquivos com php\",\"file_uploads\",\"Manipulando uploads de arquivos\",\"max_file_uploads\",\"php Manipulando uploads de arquivos\",\"post_max_size\",\"upload de arquivos em php\",\"upload_max_filesize\",\"upload_tmp_dir\"],\"articleSection\":[\"Cursos\",\"Inform\u00e1tica\",\"PHP\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/categoriaoutros.com.br\/?p=5307#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/categoriaoutros.com.br\/?p=5307\",\"url\":\"https:\/\/categoriaoutros.com.br\/?p=5307\",\"name\":\"PHP:\u00a0Trabalhando com Envio(upload) de arquivos - Categoria Outros\",\"isPartOf\":{\"@id\":\"https:\/\/categoriaoutros.com.br\/#website\"},\"datePublished\":\"2022-09-10T13:14:45+00:00\",\"dateModified\":\"2022-09-15T13:27:18+00:00\",\"description\":\"Nesse tutorial aprenderemos como criar um formul\u00e1rio para upload(envio) de arquivos e processar arquivos enviados com seguran\u00e7a em PHP.\",\"breadcrumb\":{\"@id\":\"https:\/\/categoriaoutros.com.br\/?p=5307#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/categoriaoutros.com.br\/?p=5307\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/categoriaoutros.com.br\/?p=5307#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\/\/categoriaoutros.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP:\u00a0Trabalhando com Envio(upload) de arquivos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/categoriaoutros.com.br\/#website\",\"url\":\"https:\/\/categoriaoutros.com.br\/\",\"name\":\"Categoria Outros\",\"description\":\"Assuntos Diversos\",\"publisher\":{\"@id\":\"https:\/\/categoriaoutros.com.br\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/categoriaoutros.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/categoriaoutros.com.br\/#organization\",\"name\":\"Categoria Outros\",\"alternateName\":\"Categoria Outros\",\"url\":\"https:\/\/categoriaoutros.com.br\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/categoriaoutros.com.br\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/categoriaoutros.com.br\/wp-content\/uploads\/2023\/08\/categoriaoutros-logo.jpg\",\"contentUrl\":\"https:\/\/categoriaoutros.com.br\/wp-content\/uploads\/2023\/08\/categoriaoutros-logo.jpg\",\"width\":400,\"height\":400,\"caption\":\"Categoria Outros\"},\"image\":{\"@id\":\"https:\/\/categoriaoutros.com.br\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/categoriaoutros\",\"https:\/\/twitter.com\/CategoriaOutros\",\"https:\/\/br.pinterest.com\/CategoriaOutros\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/categoriaoutros.com.br\/#\/schema\/person\/ba0f432708449436912bd6736864bb40\",\"name\":\"Categoria: Outros\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/categoriaoutros.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ed97775f0ab50750ed638ed3417ea85e19ced2c648da167a108e393ae5fd9e33?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ed97775f0ab50750ed638ed3417ea85e19ced2c648da167a108e393ae5fd9e33?s=96&d=mm&r=g\",\"caption\":\"Categoria: Outros\"},\"sameAs\":[\"http:\/\/categoriaoutros.com.br\"],\"url\":\"https:\/\/categoriaoutros.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PHP:\u00a0Trabalhando com Envio(upload) de arquivos - Categoria Outros","description":"Nesse tutorial aprenderemos como criar um formul\u00e1rio para upload(envio) de arquivos e processar arquivos enviados com seguran\u00e7a em PHP.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/categoriaoutros.com.br\/?p=5307","og_locale":"pt_BR","og_type":"article","og_title":"PHP:\u00a0Trabalhando com Envio(upload) de arquivos - Categoria Outros","og_description":"Nesse tutorial aprenderemos como criar um formul\u00e1rio para upload(envio) de arquivos e processar arquivos enviados com seguran\u00e7a em PHP.","og_url":"https:\/\/categoriaoutros.com.br\/?p=5307","og_site_name":"Categoria Outros","article_publisher":"https:\/\/www.facebook.com\/categoriaoutros","article_published_time":"2022-09-10T13:14:45+00:00","article_modified_time":"2022-09-15T13:27:18+00:00","og_image":[{"width":1022,"height":722,"url":"https:\/\/categoriaoutros.com.br\/wp-content\/uploads\/2023\/08\/pinguim-paginas-padrao.webp","type":"image\/webp"}],"author":"Categoria: Outros","twitter_card":"summary_large_image","twitter_creator":"@CategoriaOutros","twitter_site":"@CategoriaOutros","twitter_misc":{"Escrito por":"Categoria: Outros","Est. tempo de leitura":"14 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/categoriaoutros.com.br\/?p=5307#article","isPartOf":{"@id":"https:\/\/categoriaoutros.com.br\/?p=5307"},"author":{"name":"Categoria: Outros","@id":"https:\/\/categoriaoutros.com.br\/#\/schema\/person\/ba0f432708449436912bd6736864bb40"},"headline":"PHP:\u00a0Trabalhando com Envio(upload) de arquivos","datePublished":"2022-09-10T13:14:45+00:00","dateModified":"2022-09-15T13:27:18+00:00","mainEntityOfPage":{"@id":"https:\/\/categoriaoutros.com.br\/?p=5307"},"wordCount":1704,"commentCount":1,"publisher":{"@id":"https:\/\/categoriaoutros.com.br\/#organization"},"keywords":["envio de arquivos com php","file_uploads","Manipulando uploads de arquivos","max_file_uploads","php Manipulando uploads de arquivos","post_max_size","upload de arquivos em php","upload_max_filesize","upload_tmp_dir"],"articleSection":["Cursos","Inform\u00e1tica","PHP"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/categoriaoutros.com.br\/?p=5307#respond"]}]},{"@type":"WebPage","@id":"https:\/\/categoriaoutros.com.br\/?p=5307","url":"https:\/\/categoriaoutros.com.br\/?p=5307","name":"PHP:\u00a0Trabalhando com Envio(upload) de arquivos - Categoria Outros","isPartOf":{"@id":"https:\/\/categoriaoutros.com.br\/#website"},"datePublished":"2022-09-10T13:14:45+00:00","dateModified":"2022-09-15T13:27:18+00:00","description":"Nesse tutorial aprenderemos como criar um formul\u00e1rio para upload(envio) de arquivos e processar arquivos enviados com seguran\u00e7a em PHP.","breadcrumb":{"@id":"https:\/\/categoriaoutros.com.br\/?p=5307#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/categoriaoutros.com.br\/?p=5307"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/categoriaoutros.com.br\/?p=5307#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/categoriaoutros.com.br\/"},{"@type":"ListItem","position":2,"name":"PHP:\u00a0Trabalhando com Envio(upload) de arquivos"}]},{"@type":"WebSite","@id":"https:\/\/categoriaoutros.com.br\/#website","url":"https:\/\/categoriaoutros.com.br\/","name":"Categoria Outros","description":"Assuntos Diversos","publisher":{"@id":"https:\/\/categoriaoutros.com.br\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/categoriaoutros.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/categoriaoutros.com.br\/#organization","name":"Categoria Outros","alternateName":"Categoria Outros","url":"https:\/\/categoriaoutros.com.br\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/categoriaoutros.com.br\/#\/schema\/logo\/image\/","url":"https:\/\/categoriaoutros.com.br\/wp-content\/uploads\/2023\/08\/categoriaoutros-logo.jpg","contentUrl":"https:\/\/categoriaoutros.com.br\/wp-content\/uploads\/2023\/08\/categoriaoutros-logo.jpg","width":400,"height":400,"caption":"Categoria Outros"},"image":{"@id":"https:\/\/categoriaoutros.com.br\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/categoriaoutros","https:\/\/twitter.com\/CategoriaOutros","https:\/\/br.pinterest.com\/CategoriaOutros\/"]},{"@type":"Person","@id":"https:\/\/categoriaoutros.com.br\/#\/schema\/person\/ba0f432708449436912bd6736864bb40","name":"Categoria: Outros","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/categoriaoutros.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ed97775f0ab50750ed638ed3417ea85e19ced2c648da167a108e393ae5fd9e33?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ed97775f0ab50750ed638ed3417ea85e19ced2c648da167a108e393ae5fd9e33?s=96&d=mm&r=g","caption":"Categoria: Outros"},"sameAs":["http:\/\/categoriaoutros.com.br"],"url":"https:\/\/categoriaoutros.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=\/wp\/v2\/posts\/5307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5307"}],"version-history":[{"count":16,"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=\/wp\/v2\/posts\/5307\/revisions"}],"predecessor-version":[{"id":5461,"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=\/wp\/v2\/posts\/5307\/revisions\/5461"}],"wp:attachment":[{"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/categoriaoutros.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}