Maison >développement back-end >Problème PHP >Que dois-je faire si j'obtiens une erreur lors du téléchargement d'images avec des caractères chinois en PHP ?

Que dois-je faire si j'obtiens une erreur lors du téléchargement d'images avec des caractères chinois en PHP ?

PHPz
PHPzoriginal
2023-04-11 09:16:11703parcourir

Lorsque vous utilisez PHP pour télécharger des fichiers, si le nom du fichier contient des caractères chinois, le téléchargement peut échouer. En effet, dans le protocole HTTP, les caractères chinois du nom de fichier doivent être codés pour être transmis correctement, et PHP n'effectue pas cet encodage par défaut, provoquant ainsi l'échec du téléchargement.

Maintenant, discutons de la façon de résoudre ce problème.

Symptômes du problème

Lorsque nous utilisons PHP pour télécharger des fichiers, si le nom du fichier téléchargé contient des caractères chinois, le téléchargement peut signaler une erreur. Le message d'erreur est généralement constitué de caractères tronqués incompréhensibles, et la cause de l'erreur ne peut pas être. clairement souligné.

Par exemple, nous essayons de télécharger un fichier nommé "Test Image.jpg". Pendant le processus de téléchargement, si le nom du fichier contient des caractères chinois, tels que "Test Image (Chinese).jpg", le téléchargement peut échouer et un Le message d'erreur sera signalé comme suit :

Warning: move_uploaded_file(): Unable to move '/tmp/php12efan' to '/var/www/html/upload/测试图片(中文).jpg'

Vous pouvez voir que le nom du fichier dans le message d'erreur est tronqué et la cause de l'erreur ne peut pas être clairement indiquée.

La raison du problème

La raison de ce problème est que dans le protocole HTTP, les caractères chinois doivent être codés pour être transmis correctement. Lorsque vous utilisez PHP pour télécharger des fichiers, PHP convertira par défaut le nom du fichier téléchargé au format d'encodage ISO-8859-1, et les caractères chinois ne sont pas inclus dans l'encodage ISO-8859-1, donc des caractères tronqués apparaîtront.

Si nous regardons la requête HTTP téléchargée, nous pouvons voir que le nom du fichier téléchargé est comme ceci :

Content-Disposition: form-data; name="file"; filename="测试图片(中文).jpg"

Vous pouvez voir que le nom du fichier téléchargé n'est en aucun cas codé.

Solution

Il existe de nombreuses façons de résoudre ce problème. Nous proposons ici deux solutions courantes.

Option 1 : Conversion manuelle de l'encodage

Nous pouvons convertir manuellement l'encodage du nom de fichier téléchargé pour obtenir le nom de fichier correct. L'opération spécifique est la suivante :

$file = $_FILES['file'];

$filename = iconv('UTF-8', 'ISO-8859-1', $file['name']);

move_uploaded_file($file['tmp_name'], '/var/www/html/upload/' . $filename);

Dans le code ci-dessus, nous utilisons la fonction iconv pour convertir le nom de fichier de l'encodage UTF-8 en encodage ISO-8859-1, obtenir le nom de fichier correct , puis Effectuer le téléchargement de fichiers. L’inconvénient de cette méthode est qu’elle est relativement lourde et nécessite une conversion manuelle du codage, ce qui n’est pas assez pratique. iconv函数将文件名从UTF-8编码转换为ISO-8859-1编码,得到了正确的文件名,然后再进行文件上传。这种方法的缺点是比较繁琐,需要手动进行编码转换,不够方便。

方案二:修改PHP配置文件

我们可以修改PHP配置文件,让PHP自动进行编码转换,从而避免了手动编码转换的过程。具体操作如下:

  1. 找到php.ini配置文件,位置可能会因不同系统而有所不同。
  2. 打开php.ini文件,找到以下两行:

    ; Default charset for auto content type. 
    ; http://php.net/default-charset 
    default_charset = "UTF-8"
  3. ; Default charset for auto content type.这一行的后面添加以下内容:

    ; Add charset=utf-8 to Content-Type header for files with non-ASCII names
    ; that have been encoded using RFC 2231
    suhosin.upload.unicode.semantics=1
  4. 保存php.ini文件,重启Web服务器。

通过以上操作,我们就成功修改了PHP的配置文件,让PHP自动进行编码转换,解决了上传带中文的图片报错的问题。这种方法比较方便,但是需要注意的是,在使用此方法之前,需要确保服务器上已经安装了Suhosin

Option 2 : Modifier le fichier de configuration PHP

Nous pouvons modifier le fichier de configuration PHP et laisser PHP effectuer automatiquement la conversion de l'encodage, évitant ainsi le processus de conversion manuelle de l'encodage. Les opérations spécifiques sont les suivantes :

  1. Trouver le fichier de configuration php.ini L'emplacement peut varier en fonction des différents systèmes.
  2. Ouvrez le fichier php.ini et recherchez les deux lignes suivantes : 🎜rrreee
  3. 🎜Ajoutez après la ligne  ; Jeu de caractères par défaut pour le type de contenu automatique. Le contenu suivant : 🎜rrreee
  4. Enregistrez le fichier php.ini et redémarrez le serveur web.
🎜Grâce aux opérations ci-dessus, nous avons réussi à modifier le fichier de configuration PHP, permettant à PHP d'effectuer automatiquement la conversion de l'encodage, et à résoudre le problème des erreurs lors du téléchargement d'images avec des caractères chinois. Cette méthode est plus pratique, mais il convient de noter qu'avant d'utiliser cette méthode, vous devez vous assurer que l'extension Suhosin a été installée sur le serveur. 🎜🎜Résumé🎜🎜Lorsque vous utilisez PHP pour télécharger des fichiers, si le nom du fichier téléchargé contient des caractères chinois, vous pouvez rencontrer un échec de téléchargement. Pour résoudre ce problème, vous pouvez effectuer manuellement la conversion de l'encodage, ou vous pouvez modifier le fichier de configuration PHP et laisser PHP effectuer automatiquement la conversion de l'encodage. Les deux méthodes ont leurs propres avantages et inconvénients, et vous pouvez choisir la méthode appropriée pour la résoudre en fonction. situation réelle. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn