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

WBOY
Release: 2016-07-13 10:08:54
Original
1161 people have browsed it

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>
Copy after login

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 />   }
Copy after login

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"]);
Copy after login

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"]));
Copy after login

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"]));
Copy after login

Result:

<p><span>bool(false) string(4) ".txt"<br />
</span></p>





Copy after login

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");
Copy after login

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");
Copy after login

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"]);
Copy after login

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>;
Copy after login

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"]));
Copy after login

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>
Copy after login

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...
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!