Home >Backend Development >PHP Tutorial >Problem with garbled file names when uploading Chinese files in PHP, _PHP tutorial

Problem with garbled file names when uploading Chinese files in PHP, _PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:08:541227browse

The problem of garbled file names when uploading Chinese files in php,

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:

1. Question code

html part:

<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>

php part:

<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.

2. Preliminary test

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.

3. The online introduction method failed, try again

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>(&lsquo;UTF-8&rsquo;, &lsquo;GBK&rsquo;,<span>&rsquo;gb2312&rsquo;));
</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

4. Another solution

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

5.The following is the conclusion

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/949209.htmlTechArticleThe problem of garbled file names when uploading Chinese files in PHP. Uploading files in PHP is the most basic technical point, but go deeper. There are also many problems that need to be solved. No, after uploading the Chinese file, the text...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn