2010-09-01 5 views
1

Je suis en train de publier via curl, j'ai utilisé le même code encore et encore sans problème, mais maintenant je dois être en mesure d'utiliser un tableau pour les messages (i ne suis pas sûr s'il y a un terme approprié pour cela?).Publier avec PHP et Curl, tableau profond

Je devrais préciser que c'est spécifiquement un fichier que j'essaie de publier, mais je ne peux pas le faire fonctionner avec une chaîne non plus, donc je ne pense pas que ce soit trop le cas.

C'est absouletly bien:

 
$uploadData = array(); 
$uploadData['uploads'] = "@".$file; 
$uploadData['iagree'] = 'on'; 

Cela ne semble pas fonctionner:

 
$uploadData = array(); 
$uploadData['uploads'][0] = "@".$file; 
$uploadData['iagree'] = 'on'; 

Dans le deuxième exemple que je suis en train de reproduire une entrée avec le nom d'attribut = "uploads [] "

Évidemment, j'essaie de boucler un site externe, mais si j'expérimente le curling d'une page sur mon propre serveur afin que je puisse voir ce qui est envoyé, je peux voir que le tableau des uploads est co nverted à une chaîne:

 
print_r($_POST); 
print_r($_FILES); 

retours:

 
Array 
(
    [uploads] => Array 
    [iagree] => on 
) 

Array 
(
) 

Ceci est mon plein Curl:

 
    $uploadData = array(); 
    $uploadData['uploads'][] = "@".$file; 
    $uploadData['iagree'] = 'on'; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $theLink); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $uploadData); 
    $upload_response = curl_exec($ch); 
    curl_close($ch); 

J'ai essayé de donner autant d'informations que possible, mais si i » J'ai manqué quelque chose, n'hésitez pas à demander et je vous en fournirai plus.

À part cela, est-ce que quelqu'un a des suggestions ou des solutions?

Répondre

2

$uploadData['uploads[]'] = "@".$file; et en le passant comme un tableau devrait fonctionner, gardez à l'esprit que vous avez besoin du chemin absolu vers le fichier.

Il n'y a pas de mécanisme dans HTTP simple (multipart/form-data ou application/x-www-form-urlencoded) pour envoyer des 'tableaux'. Toutefois, PHP interprète les caractères [ & ] dans des paires clé-valeur comme spéciales. PHP est seul dans ce AFAIK, ce n'est pas un mécanisme HTTP, c'est juste l'analyse de l'entrée PHP fait, comme c'est le remplacement . dans le nom des valeurs avec _. Curl est un paquet tiers qui vit séparément de PHP, et en tant que tel ne comprend pas les tableaux multidimensionnels.

+0

Merci pour cela fonctionne parfaitement, désolé pour la réponse tardive. C'était le milieu de la nuit quand j'ai d'abord posté cette question: D – Rob

0

Essayez de passer la chaîne de requête:

$uploadData = 'uploads[][email protected]' . $file . '&iagree=on&uploads[][email protected]' . $file2; 

Voir si cela fonctionne pour vous.

EDIT

En lisant le manuel, la chaîne doit être urlencoded, essayez ceci:

$uploadData = urlencode('uploads[][email protected]' . $file . '&iagree=on&uploads[][email protected]' . $file2);

reçu cette information de la page man curl_setopt():

Note:

Le passage d'un tableau à CURLOPT_POSTFIELDS encodera les données en tant que données multipart/form, tandis que le passage d'une chaîne codée URL encodera les données en tant qu'application/x-www-form-urlencoded.

j'ai utilisé le urlencode mal, essayez ceci:

$uploadData = 'uploads[]=' . urlencode('@' . $file) . '&iagree=' . urlencode('on') . '&uploads[]=' . urlencode('@' . $file2); 

MISE À JOUR

Ok ceci est mon dernier coup à elle.En lisant quelques commentaires de l'utilisateur sur la page curl, j'ai trouvé quelque chose sur la sérialisation du sous-tableau. Donc:

$uploadData = array('iagree' => 'on', 'uploads' => serialize(array('@' . $file))); 

Espérons que c'est la clé. Si ça ne marche pas ... eh bien, ce n'est peut-être pas possible.

Essayez cette option et voyez si cela fonctionne. (Désolé pour l'essai et l'erreur, je n'ai pas une méthode pour le tester!)

+0

Cela envoie la chaîne "@ root/to/my/testfile.zip" plutôt que le fichier réel. Mais il envoie le $ _POST en tableau. – Rob

+0

Mis à jour avec des informations en fonction de la page man http://www.php.net/curl_setopt étant donné que la chaîne doit être encodée pour être passée avec le bon encodage. –

+0

codage url c'est encore pire, absouletly rien n'est posté. J'ai utilisé curl plusieurs fois sans urlencoding donc je ne suis pas sûr si c'est nécessaire. Néanmoins, cela n'aide pas dans ce cas, bravo cependant! – Rob