8311 sujets

Développement web côté serveur, CMS

Bonjour,

Rencontrant un problème que je n'arrive pas à résoudre, je me tourne vers vous espérant obtenir un peu d'aide.

En voici les grandes lignes :

Je dispose d'un sous-domaine A. Sur ce sous-domaine A, j'ai un formulaire HTML pour uploader des fichiers. Je souhaite envoyer les fichiers chargés avec ce formulaire sur un sous-domaine B.
Le traitement du formulaire se fait en PHP.

Voici ce que je souhaite faire côté traitement (si vous avez d'autres idées je suis preneur) :
copier le fichier chargé par l'utilisateur dans un répertoire upload du sous-domaine A avec la fonction move_uploaded_file().
Ensuite, à l'aide de FTP, envoyer le fichier du sous-domaine A vers le sous-domaine B.

Pourquoi faire le déplacement du fichier en deux temps ? Car j'ai entendu dire, et cela me semble logique pour des raisons évidentes de sécurité, qu'il n'était pas possible d'uploader des fichiers entre serveurs/domaines/sous-domaines à l'aide de move_uploaded_file().

Voici la partie du code qui gère le traitement :
Pour l'instant, je n'arrive pas à uploader le fichier dans mon dossier upload avec move_uploaded_file(). Le navigateur m'affiche "upload failed".


if(!empty($_FILES['edit_partners_src']['name']))
{
	if($_FILES['edit_partners_src']['error'] == 0)
	{
		$fileInfo = pathinfo($_FILES['edit_partners_src']['name']);
		$extUpload = $fileInfo['extension'];
		$extAllowed = array('jpg', 'jpeg', 'gif', 'png');
		$dirDest = dirname(__FILE__).'/';
		$destName = "file_".date("YmdHis").".".$extUpload;
		if(in_array($extUpload, $extAllowed))
		{
			if(move_uploaded_file($_FILES["edit_partners_src"]["tmp_name"], $dirDest.$destName))
			{
				echo "ok";
				//envoi FTP
			}
			else
			{
				echo "upload failed";
			}
		}
		else
		{
			echo "file extension error";
		}
	}
	else
	{
		echo "file get error";
	}
}


Merci par avance pour votre aide !
Modifié par MCLM74 (04 Nov 2019 - 14:15)
Salut

Hésite pas à faire des var_dump() de tes variables pour bien voir si le chemin que tu prend correspond à celui que tu penses
surtout sur $dirDest.$destName
JENCAL a écrit :
Salut

Hésite pas à faire des var_dump() de tes variables pour bien voir si le chemin que tu prend correspond à celui que tu penses
surtout sur $dirDest.$destName


Salut,
Merci pour ta réponse.
J'en fait, en local tout fonctionne bien.
Mais sur le serveur, ça plante...
Ok

Du coup, on peut pas deviner là.
On sait que le move te renvoit false, mais qu'elle est la véritable erreur stp ?
Parce que y'en a un paquet :

UPLOAD_ERR_INI_SIZE = Value: 1; The uploaded file exceeds the upload_max_filesize directive in php.ini.

UPLOAD_ERR_FORM_SIZE = Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.

UPLOAD_ERR_PARTIAL = Value: 3; The uploaded file was only partially uploaded.

UPLOAD_ERR_NO_FILE = Value: 4; No file was uploaded.

UPLOAD_ERR_NO_TMP_DIR = Value: 6; Missing a temporary folder. Introduced in PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE = Value: 7; Failed to write file to disk. Introduced in PHP 5.1.0.

UPLOAD_ERR_EXTENSION
En plus, il faut tester si le folder est un folder ou non

if (is_dir($upload_dir) && is_writable($upload_dir)) {
//le reste
}

Modifié par JENCAL (04 Nov 2019 - 14:36)
JENCAL a écrit :
En plus, il faut tester si le folder est un folder ou non

if (is_dir($upload_dir) && is_writable($upload_dir)) {
//le reste
}

Merci pour ton aide.
Voici ce que je reçois en faisant un var_dump($dirDest.$destName) :
/home/0/p/sousdomaine.domaine.com/www/forms/file_20191104133902.png
Et ça bloque si je fait un if(is_dir($dirDest) && is_writable($dirDest))
Ok, sans doute qu'il manque les droits alors,
mais pour être sûr il faudrait que tu check les erreurs de ton move upload file comme je disais au dessus.
JENCAL a écrit :
Ok, sans doute qu'il manque les droits alors,
mais pour être sûr il faudrait que tu check les erreurs de ton move upload file comme je disais au dessus.

Voici les deux erreurs :

Warning:move_uploaded_file(/home/0/p/sousdomaine.domaine.com/www/forms/file_20191104134841.png): failed to open stream: Permission denied

Warning:move_uploaded_file(): Unable to move '/home/0/prepend/tmp/php8heLyL' to '/home/0/p/sousdomaine.domaine.com/www/forms/file_20191104134841.png'

Il me manque des droits c'est ça ?
Et pour la deuxième erreur ?
Bah voila, tu as l'erreur failed to open stream: Permission denied

Suffit de mettre les droits
Modifié par JENCAL (04 Nov 2019 - 14:52)
Meilleure solution
A priori oui il manque les droits. Tu peux mettre le CHMOD de ton dossier à 0751 et ça devrait mieux marcher Smiley smile
La deuxième erreur, je pense qu'elle est liée: comme il ne peut pas accéder au dossier, bah il ne peut pas déplacer le fichier
JENCAL a écrit :
Bah voila, tu as l'erreur failed to open stream: Permission denied

Suffit de mettre les droits

Ca fonctionne, merci beaucoup.
Ensuite, pour passer le fichier du sous-domaine A vers le sous-domaine B, utiliser FTP est-elle la bonne solution ?
Modifié par MCLM74 (04 Nov 2019 - 14:59)
Mathieu8337 a écrit :
A priori oui il manque les droits. Tu peux mettre le CHMOD de ton dossier à 0751 et ça devrait mieux marcher Smiley smile
La deuxième erreur, je pense qu'elle est liée: comme il ne peut pas accéder au dossier, bah il ne peut pas déplacer le fichier

J'ai mis le CHMOD de mon dossier à 0773, ça fonctionne correctement
MCLM74 a écrit :

Ca fonctionne, merci beaucoup.
Ensuite, pour passer le fichier du sous-domaine A vers le sous-domaine B, utiliser FTP est-elle la bonne solution ?


Hmmm pour être full sécu tu pourrais faire un scp directement en ssh.

après, faut le dynamiser...
Modifié par JENCAL (04 Nov 2019 - 15:03)
JENCAL a écrit :


Hmmm pour être full sécu tu pourrais faire un scp directement en ssh.

après, faut le dynamiser...

Ok, je ne connais pas la méthode SCP, je vais aller jeter un oeil.
Faut aussi que je regarde si la machine distante dispose d'un accès SSH...