2010-07-20 2 views
2

Mon script PHP qui télécharge un fichier ne peut pas le faire dans les répertoires de niveau supérieur à lui-même.PHP Impossible de télécharger le fichier dans des répertoires supérieurs à celui-ci

Par exemple: il sauvera dans upload/ (un chemin relatif au même niveau que le script), mais pas dans /usr/local/hello/ même si les autorisations de fichiers sont exactement même. Il n'y a pas de problèmes avec la taille maximale du téléchargement, la taille maximale du message, le temps d'exécution et le mode sans échec. Quelqu'un a des pensées? Je ne peux même pas obtenir un message d'erreur - juste le $worked ci-dessous renvoie faux quand il échoue.

<?php 
// Removed the rest of the error-checking code! 
$contentDir = "/usr/local/hello/"; // <-- doesn't work, chmod 0777, owner: root, group root 
//$contentDir = "upload/"; <-- works, chmod 0777 owner: root, group: root 
error_reporting(E_ALL); 
$filename = $_FILES["filey"]["name"]; 
$worked = move_uploaded_file(
       $_FILES["filey"]["tmp_name"], 
       $contentDir.$filename); 
var_dump($worked); 
?> 

Edit: Mes réglages open_basedir, donnés par phpinfo(), sont les suivants:

Directive  Local Value Master Value 
open_basedir no value no value 

Merci!

+0

probablement pas le cas (j'irais pour open_basedir), mais vous ne courez pas cette chose chrootée? c'est-à-dire que vous pensez que c'est/usr/local/hello, mais php pense autrement? (parce que l'autre différence est absolue par rapport au chemin relatif) – mvds

Répondre

4

open_basedir La variable de configuration limite probablement les répertoires.

Voir open_basedir dans le manuel PHP.

+0

S'il n'a pas de valeur, il ne devrait rien limiter. – Mewp

1

S'il vous plaît nous montrer le contenu de $_FILES['filey']['error'], les erreurs de téléchargement de fichiers ne sont pas signalés comme d'habitude, mais dans cette structure.

http://php.net/manual/en/features.file-upload.errors.php

Bien qu'il soit très probable que Mewp dit

+0

Bien que je ne l'ai pas ajouté dans la question, le vidage de cette variable est toujours: '[" erreur "] => int (0)': 'Valeur: 0; Il n'y a pas d'erreur, le fichier téléchargé avec succès. – ash

0

Vous utilisez le nom du fichier du côté client d'origine comme le nom du fichier côté serveur. Ce nom de fichier existe-t-il déjà sur le serveur? Le répertoire peut être 0777, mais si ce nom de fichier existe déjà, il doit également pouvoir être écrit par l'UID du serveur Web.

par exemple. Si vous téléchargez "resume.doc", est-ce que /usr/local/hello/resume.doc existe déjà? Si ce n'est pas aussi le mode 0777, alors le move_uploaded_file() échouera.

L'état docs que si le fichier source IS un fichier uploadé valide, mais le mouvement échoue pour une raison quelconque, sera émis un avertissement, afin de vérifier votre erreur PHP journal pour cela.

Questions connexes