2009-12-16 5 views
1

Voici mon problème. J'ai un système de suivi des tickets qui n'est pas très "convivial" mais je souhaite que mes utilisateurs soumettent des "tickets" au système sans qu'ils aient à le voir. Je suis allé jusqu'à utiliser un formulaire HTTP personnalisé et à poster sur le système de suivi des tickets. Un problème est que la page "réussite/achèvement" a tendance à confondre les gens. Donc j'ai pensé ... bien puisque je ne peux pas changer le système de billet pour employer une page différente de «succès». Je vais juste gérer l'échange HTTP Post avec CURL et signaler une page personnalisée de succès ou de problème. Heres du code abstrait.Post Envoyé un fichier vers une autre page PHP?

fichier: tickethelper.php

<?php 
extract($_POST); 
$url = 'TICKETSYSTEMURL'; 
$fields = array(
     'fullname'=>urlencode($fullname), 
     /*many more fields*/ 
     ); 

foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } 
rtrim($fields_string,'&'); 
$ch = curl_init(); 

curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_POST,count($fields)); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); 
curl_setopt($ch, CURLOPT_MAXREDIRS, 0); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE); 
curl_setopt($ch, CURLOPT_HEADER, FALSE); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$contents = curl_exec($ch); 
curl_close($ch); 
if((strlen(strstr($contents,'Your ticket has been submitted')))>0){ 
     header("Location: http://THANKYOU"); 
} 
     else{ 
       header("Location: http://OOPS"); 
     } 

?> 

Cependant, ce que je pris conscience que je manque mon téléchargement de fichiers. La plupart des exemples CURL que j'ai vus concernent le téléchargement de fichiers locaux vers une page HTTP POST distante.

Comment puis-je gérer la réception d'un fichier à partir du formulaire HTTP de mon utilisateur, le traiter dans le 'tickethelper' et le POST sur le 'TICKETSYSTEMURL'?

-Israél

Répondre

1

Eh bien, je ne peux pas dire que je l'ai fait moi-même, mais d'après la documentation PHP concernant CURL et traitement de fichiers (PHP.net)

CURLOPT_INFILE | Le fichier à partir duquel le transfert doit être lu lors du téléchargement.

valeur

doit être une ressource (utilisant fopen(), par exemple) pour les valeurs suivantes du paramètre option:

Vous devriez être en mesure d'appeler fopen() sur le fichier qui a été téléchargé (voir à la documentation concernant Handling File Uploads) Je ne suis pas sûr, mais vous pouvez avoir besoin d'appeler move_uploaded_file() dans un répertoire contrôlé sur le serveur avant d'appeler fopen()

Par exemple:

$ch = curl_init(); 

$file = fopen($_FILES['file-field-name']['tmp_name'], 'r'); 

// OTHER CURL CONFIGURATION 
curl_setopt($ch, CURLOPT_INFILE, $file); 

curl_exec($ch); 
1

D'abord, votre script peut accéder au fichier téléchargé via le tableau $ _FILES.

De http://www.tizag.com/phpT/fileupload.php

Le tableau $ _FILES est où PHP stocke toutes les informations sur les fichiers. Il ya sont deux éléments de ce tableau que nous devra comprendre pour cet exemple .

  • uploadedfile - uploadedfile est la référence que nous avons attribuée dans notre formulaire HTML . Nous aurons besoin de ceci pour dire au tableau $ _FILES quel fichier nous voulons jouer avec.
  • $ _FILES ['uploadedfile'] ['nom'] - nom contient le chemin d'origine du fichier téléchargé par l'utilisateur. Tmp_name contient le chemin d'accès au fichier temporaire qui se trouve sur le serveur .Le fichier doit exister sur le serveur dans un répertoire temporaire avec un nom temporaire .

Pour inclure ce fichier dans le POST vous envoyez avec libcurl, utilisez un tableau de champs à la place d'une chaîne. Inclure le fichier comme l'un des champs:

$post_fields = array (
    $key => $value, 
    ... 
    $file_key => "@" . $filename, 
); 

Si vous utilisez le symbole « @ », libcurl va lire le fichier et l'inclure dans le POST.

Ensuite, utilisez

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); 
+0

Maintenant, ma question est. Est-ce que je perds le nom d'origine? J'ai fait un print_r ($ _ FILES) et je vois le nom original, et le chemin temp pour le fichier. Lorsque mon autre application publie le fichier sera-t-il/tmp/kwsnWjwn au lieu de 'FriendlyName.xls'? –

+0

Israel Lopez, vous perdrez le nom d'origine en utilisant libcurl. Je ne crois pas que vous pouvez définir cette valeur en utilisant libcurl, bien que d'autres outils puissent le permettre. Cependant, vous pouvez utiliser la fonction move_uploaded_file() de PHP pour déplacer/renommer le fichier temporaire en un nom convivial sur votre système, puis utiliser ce fichier dans votre tableau $ post_fields. – bmb

Questions connexes