J'essaie de faire enregistrer des données php sur le serveur. Ces données sont générées via le script js. Cependant, je ne parviens pas à faire créer le fichier par le php. Le message d'erreur que j'obtiens est le suivant: Avertissement: file_put_contents (data /) [function.file-put-contents]: échec de l'ouverture du flux: un répertoire de

J'ai vérifié les autorisations et le php.ini pour les restrictions avec succès nul. Des idées?

Si je change le bit "data /" en "X", le serveur crée un fichier vide nommé X. Ce qui semble étrange. Les commandes utilisées dans le script js proviennent de jsPsych.

Merci beaucoup!

J'ajoute le code:

function saveData(name, data){
  var xhr = new XMLHttpRequest();

  xhr.open('POST', 'write_data.php');
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.send(JSON.stringify({filename: name, filedata: data}));
};

(...)

On_finish:

function(){
  saveData('subject-'+subject_id+'.csv', jsPsych.data.get().csv() );
}

<?php

$filename = 'data/'.$_POST['filename'];
$data = $_POST['filedata'];
file_put_contents($filename, $data);

?>
0
Petr Palíšek 13 avril 2018 à 21:11

3 réponses

Meilleure réponse

Je ne suis pas un expert de Xhr et de votre façon de le faire. Je connais cependant jQuery, et JS régulier.

Méthode Jquery:

var postName = 'something'; // this is found with $_POST['postName'] in PHP
var postName2 = 'somethingElse'; 
$.post("path/yourFile.php", {postName:value, postName2:value}, function(data){
            if(data == 'success'){
                // complete success 
            } else {
                // assessment failed to save
                console.log(data); 
            }
        });

Méthodes JS:

La première chose que vous faites, c'est d'ouvrir votre demande ...

var xhr= new XMLHttpRequest(); 
xhr.open("POST", "write_data.php", true);

Essaye ça...

xhr.open ("POST", "write_data.php", true );

Ensuite, vous pouvez soit utiliser cette façon de procéder ...

xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("fname=Wubur&lname=Com");

Ou la manière JSON ...

xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify({fname:"Harry", lname:"Potter"}));

YourFile.php (où nous POSTONS):

Si vous utilisez la première méthode (PAS json) ...

<?php 

if(isset($_POST['fname']) && isset($_POST['lname']){ // check for post param & permission to create template 
    // do stuff here... 
    echo 'success'; // if everything worked
} else {
    echo 'I need fname and lname!!!'; // no post params supplied 
}

?>

Si vous utilisez la méthode JSON ...

<?php 

$data = json_decode(file_get_contents('php://input'), true);
$data2 = json_decode(file_get_contents('php://input'));
// try both, I forget which one it is...
echo "success";

?>
1
Nerdi.org 14 avril 2018 à 21:12

Je suppose que $_POST['filename']; est vide. L'erreur:

Avertissement: file_put_contents (data /) [function.file-put-contents]: échec de l'ouverture du flux: est un répertoire

Est explicite et montre même data/. Vous remarquez l'absence de nom de fichier après le "/"? Vérifiez votre courrier entrant.

Plus de détails

Le Super Global $_POST n'a pas de clé filename ou cette clé est vide. Cette ligne de code $filename = 'data/'.$_POST['filename']; produit ceci: data/. Donc, $_POST['filename'] est vide ou n'existe pas. Utilisez var_dump ou print_r pour examiner $_POST et voir ce qu'il contient.

0
gforce301 13 avril 2018 à 18:40

Le problème semble être lié à votre type de contenu. En PHP, seul un Content-Type de application/x-www-form-urlencoded ou multipart/form-data remplit le {super tableau global $_POST. Puisque vous dites au serveur que vous envoyez les données via application/json, vous devez récupérer les données du corps de la demande via:

php://input

Essaye ça:

$params = json_decode("php://input", TRUE);
$filename = 'data/'.$params['filename'];
$data = $params['filedata'];
file_put_contents($filename, $data);
0
War10ck 13 avril 2018 à 19:02