web-dev-qa-db-fra.com

Réglage PHP tmp dir - PHP le téléchargement ne fonctionne pas

Je travaille sur le téléchargement de fichiers via une page Web avec une barre de progression avec Téléchargeur de fichier Valums . Presque tout fonctionne bien, mais je ne suis pas en mesure de modifier le répertoire tmp par défaut, où le fichier est stocké pendant le téléchargement.

Les fichiers doivent être stockés dans le répertoire /upload et non dans le répertoire système /tmp par défaut, car /tmp est monté sur un disque RAM dont la taille est limitée à 4 Mo. L'utilisateur téléchargera des fichiers d'environ 10 Mo.

J'ai cherché beaucoup de pages Web, mais aucune des solutions n'a fonctionné . J'ai défini le répertoire temporaire dans php.ini:

upload_tmp_dir =/upload

J'ai défini les autorisations sur le répertoire /upload et Apache est le propriétaire du fichier. Le répertoire est donc en écriture pour PHP.

J'ai défini le chemin cible dans l'utilitaire de téléchargement de fichiers sur /upload, car je souhaite également que les fichiers soient stockés après le téléchargement dans ce répertoire. Le résultat final est que les petits fichiers sont téléchargés avec succès, mais que les fichiers de plus de 4 Mo ne peuvent pas être téléchargés - la seule raison de ce problème qui me vient à l’esprit est que les fichiers sont stockés dans /tmp pendant le téléchargement. Pour être sûr, j'ai vérifié avec sys_get_temp_dir() et le résultat était /tmp- donc PHP ignore ma directive php.ini ou il existe un autre moyen de définir l'emplacement où les fichiers sont stockés lors du téléchargement.

Oh, et la dernière information: open_basedir n'est pas définie, donc l'accès PHP au disque est uniquement limité par les autorisations de fichier.

23
Wookie88

Le problème décrit ici a été résolu par moi il y a assez longtemps, mais je ne me souviens pas vraiment de la raison principale pour laquelle les téléchargements ne fonctionnaient pas. Plusieurs choses devaient être corrigées pour que le téléchargement puisse fonctionner. J'ai créé une liste de contrôle qui pourrait aider d'autres personnes ayant des problèmes similaires et je la modifierai pour la rendre aussi utile que possible. Comme je l'ai dit précédemment sur le chat, je travaillais sur un système intégré, de sorte que certains points peuvent être ignorés sur des systèmes non intégrés.

  • Vérifiez upload_tmp_dir dans le fichier php.ini. C'est le répertoire où PHP stocke les fichiers temporaires lors du téléchargement.

  • Vérifiez open_basedir dans le fichier php.ini. Si défini, il limite les droits de lecture/écriture PHP au chemin spécifié et à ses sous-répertoires. Assurez-vous que upload_tmp_dir se trouve dans ce chemin.

  • Vérifiez post_max_size dans le fichier php.ini. Si vous souhaitez télécharger des fichiers de 20 Mo, essayez quelque chose d'un peu plus gros, tel que post_max_size = 21M. Cela définit la plus grande taille du message POST que vous utilisez probablement pendant le téléchargement.

  • Vérifiez upload_max_filesize dans le fichier php.ini. Ceci spécifie le plus gros fichier pouvant être téléchargé.

  • Vérifiez memory_limit dans le fichier php.ini. C'est la quantité maximale de mémoire qu'un script peut consommer. Il est bien évident que cela ne peut pas être inférieur à la taille du téléchargement (pour être honnête, je ne suis pas tout à fait sûr à ce sujet - PHP tamponne probablement lors de la copie de fichiers temporaires).

  • Assurez-vous de bien vérifier le fichier php.ini utilisé par PHP sur votre serveur Web. La meilleure solution consiste à exécuter le script avec la directive décrite ici http://php.net/manual/en/function.php-ini-loaded-file.php (fonction php_ini_loaded_file)

  • Vérifiez sous quel utilisateur php s'exécute (Voir ici comment le faire: Comment vérifier sous quel utilisateur php s'exécute? ). J'ai travaillé sur différentes distributions et serveurs. Parfois, il s'agit de Apache, mais parfois, il peut être root. Quoi qu'il en soit, vérifiez que cet utilisateur dispose des droits de lecture et d'écriture dans le répertoire temporaire et le répertoire dans lequel vous téléchargez. Vérifiez tous les répertoires dans le chemin au cas où vous téléchargez dans le sous-répertoire (par exemple, /dir1/dir2/- vérifiez à la fois dir1 et dir2.

  • Sur les plates-formes intégrées, il est parfois nécessaire de limiter l’écriture au système de fichiers racine car elle est stockée sur une carte flash, ce qui permet de prolonger la durée de vie de cette carte. Si vous utilisez des scripts pour activer/désactiver les écritures de fichiers, assurez-vous de les activer avant le téléchargement.

  • J'ai eu de graves problèmes avec PHP> 5.4 Surveillance du chargement basée sur des sessions (comme décrit ici http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/ ) sur certains plates-formes. Essayez quelque chose de simple au début (comme ici: http://www.dzone.com/snippets/very-simple-php-file-upload ). Si cela fonctionne, vous pouvez essayer des mécanismes plus sophistiqués.

  • Si vous apportez des modifications dans php.ini, n'oubliez pas de redémarrer le serveur pour que la configuration soit rechargée.

56
Wookie88

Je me suis longtemps débattu avec ce problème …… Ma solution consistait à modifier le fichier php.ini, dans le dossier contenant le script php. Cela était important, car la modification du fichier php.ini à la racine ne résolvait pas le problème (j'ai un fichier php.ini dans chaque dossier pour un contrôle granulaire) . (le tampon de sortie n'est probablement pas nécessaire pour ce problème)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M
2
CapCrunch

Dans mon cas, c'est l'open_basedir qui a été défini. Je l'ai commenté (par défaut) et mon problème a été résolu. Je peux maintenant définir le répertoire de téléchargement n'importe où.

0
Tony_H

créer un fichier php avec:

<?php
    print Shell_exec( 'whoami' );
?>

ou 

<?php echo exec('whoami'); ?>

essayez la sortie dans votre navigateur Web .si la sortie n'est pas votre exemple utilisateur: www-data passez à l'étape suivante

ouvrir en tant que root:

/ etc/Apache2/envvars

cherche ces lignes:

export Apache_RUN_USER = nom d'utilisateur

export Apache_RUN_GROUP = nom du groupe

exemple:

exporter Apache_RUN_USER = www-data

exporter Apache_RUN_GROUP = www-data

où: 

nom d'utilisateur = votre nom d'utilisateur ayant accès au dossier que vous utilisez group = groupe que vous avez attribué un accès en lecture + écriture + exécution

changez le en:

export Apache_RUN_USER = "nom d'utilisateur"

export Apache_RUN_GROUP = "groupe"

si votre utilisateur n'a pas encore accès:

Sudo chmod 775 -R "répertoire du dossier auquel vous souhaitez donner l'accès r/w/x" 

0