Home >Backend Development >PHP Tutorial >Problem with garbled file names when uploading Chinese files in PHP, _PHP tutorial
Uploading files in php is the most basic technical point, but there are many problems that need to be solved when going deeper. No, after uploading the Chinese file, the file name became garbled.
The following is the problem code, it is very simple:
<span> 1</span> <span><</span><span>html</span><span>></span> <span> 2</span> <span><</span><span>body</span><span>></span> <span> 3</span> <span> 4</span> <span><</span><span>form </span><span>action</span><span>="upload_file.php"</span><span> method</span><span>="post"</span> <span> 5</span> <span>enctype</span><span>="multipart/form-data"</span><span>></span> <span> 6</span> <span><</span><span>label </span><span>for</span><span>="file"</span><span>></span>Filename:<span></</span><span>label</span><span>></span> <span> 7</span> <span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="file"</span><span> id</span><span>="file"</span> <span>/></span> <span> 8</span> <span><</span><span>br </span><span>/></span> <span> 9</span> <span><</span><span>input </span><span>type</span><span>="submit"</span><span> name</span><span>="submit"</span><span> value</span><span>="Submit"</span> <span>/></span> <span>10</span> <span></</span><span>form</span><span>></span> <span>11</span> <span>12</span> <span></</span><span>body</span><span>></span> <span>13</span> <span></</span><span>html</span><span>></span>
<span> 1</span> <?<span>php </span><span> 2</span> <span>if</span> (<span>$_FILES</span>["file"]["error"] > 0<span>) </span><span> 3</span> <span>{ </span><span> 4</span> <span>echo</span> "Return Code: " . <span>$_FILES</span>["file"]["error"] . "<br />"<span>; </span><span> 5</span> <span>}</span><span>else</span> <span> 7</span> <span>{ </span><span> 8</span> <span>echo</span> "Upload: " . <span>$_FILES</span>["file"]["name"] . "<br />"<span>; </span><span> 9</span> <span>echo</span> "Type: " . <span>$_FILES</span>["file"]["type"] . "<br />"<span>; </span><span>10</span> <span>echo</span> "Size: " . (<span>$_FILES</span>["file"]["size"] / 1024) . " Kb<br />"<span>; </span><span>11</span> <span>echo</span> "Temp file: " . <span>$_FILES</span>["file"]["tmp_name"] . "<br />"<span>; </span><span>12</span> <span>13</span> <span>if</span> (<span>file_exists</span>("upload/" . <span>$_FILES</span>["file"]["name"<span>])) </span><span>14</span> <span> { </span><span>15</span> <span>echo</span> <span>$_FILES</span>["file"]["name"] . " already exists. "<span>; </span><span>16</span> <span> } </span><span>17</span> <span>else</span> <span>18</span> <span> { </span><span>19</span> <span>move_uploaded_file</span>(<span>$_FILES</span>["file"]["tmp_name"], <span>20</span> "upload/" . <span>$_FILES</span>["file"]["name"]);<br /> }<br /> }
Uploaded a file named "test data.txt", oh ho, the file was uploaded, but the file name was garbled.
Search the Internet for solutions and add
<span>move_uploaded_file</span>(<span>$_FILES</span>["file"]["tmp_name"], "upload/" . <span>$_FILES</span>["file"]["name"]);
changed to
<span>move_uploaded_file</span>(<span>$_FILES</span>["file"]["tmp_name"],"upload/" . <span>iconv</span>("UTF-8","gbk",<span>$_FILES</span>["file"]["name"]));
It turns out that the return value of iconv function is false.
Check the function manual and find that the second parameter has a special usage. A simple translation is meYou can append //TRANSLIT or //IGNORE after the encoding, the former will remove the characters that cannot be translated Convert to the closest character, the latter simply ignores characters that cannot be converted.
Try it:
<span>1</span> <span>var_dump</span>( <span>iconv</span>("UTF-8","gbk//TRANSLIT",<span>$_FILES</span>["file"]["name"<span>])); </span><span>2</span> <span>var_dump</span>( <span>iconv</span>("UTF-8","gbk//IGNORE",<span>$_FILES</span>["file"]["name"]));
Result:
<p><span>bool(false) string(4) ".txt"<br /> </span></p>
That is to say, Chinese characters cannot be converted, and there are not even close characters. It seems that the methods introduced online are not omnipotent.
Let me guess, Maybe my system will cause garbled characters when creating Chinese files, so I rewrote the code:
<span>move_uploaded_file</span>(<span>$_FILES</span>["file"]["tmp_name"], "upload/测试数据.txt");
The result was successfully created without garbled characters. . . In other words, it is not a system problem.
Think about it, my php file itself is utf8 encoded, then
<span>move_uploaded_file</span>(<span>$_FILES</span>["file"]["tmp_name"],"upload/测试数据.txt");
This statement must use utf8 encoding, so the file name uploaded before must not be utf8 encoded, then the following statement must be wrong, because the source string itself is not utf8 encoded:
<span>iconv</span>("UTF-8","gbk//TRANSLIT",<span>$_FILES</span>["file"]["name"]);
Use the function to check the encoding of the source string:
<span>1</span> <span>$e</span>=mb_detect_encoding(<span>$text</span>, <span>array</span>(‘UTF-8’, ‘GBK’,<span>’gb2312’)); </span><span>2</span> <span>echo</span> <span>$e</span>;
The result is CP936, that is, the source string encoding is GBK.
Try it
<span>move_uploaded_file</span>(<span>$_FILES</span>["file"]["tmp_name"],"upload/" . <span>iconv</span>("gbk","UTF-8",<span>$_FILES</span>["file"]["name"]));
Problem solved, no more garbled characters
In fact, there is another solution, which is to add
in the middle of the head tag of the html file.<span><</span><span>meta </span><span>http-equiv</span><span>="Content-Type"</span><span> content</span><span>="text/html; charset=utf-8"</span> <span>/></span>
This way the encoding remains unified and there is no need to transcode any more