2011-08-03 4 views
1

J'essayais de faire un appel API RESTful pour télécharger des vidéos via la méthode POST. Ce qui me manque, c'est que je ne connais pas les meilleures pratiques pour écrire ce genre d'API aussi je ne trouve aucune ressource sur internet à suivre. En ce moment je fais ceci:Télécharger un fichier via l'API RESTful?

Je travaille dans le cadre de PHP et de zend (Zend_Rest_Route).

Première approche:

utilisant file_get_contents côté client et POST à ​​l'aide d'API boucle, et sur le côté serveur à l'aide file_put_contents pour écrire les données et l'envoi d'une réponse appropriée.

Deuxième:

en utilisant Zend_File_Treansfer pour recevoir le fichier à côté du serveur, et de mettre l'adresse de mon téléchargement point final api dans Zend_Form avec la méthode mise en poste. Dans ce cas, le fichier est téléchargé sur le serveur, mais après l'envoi du formulaire, la barre d'adresse de l'URL pointe vers le serveur API et ne revient jamais au formulaire.

Est-ce que je le fais bien? Si ce n'est pas le cas, dites-moi quelles sont les meilleures pratiques et comment y parvenir.

Nous vous remercions de votre temps.

Répondre

0

avez-vous essayé d'ajouter une redirection à la fin de votre action de contrôleur qui gère le téléchargement? (sinon vous devriez vraiment comme bonne pratique de rediriger après la publication) (assurez-vous de rediriger APRÈS que votre logique a été exécutée). En substance, la «page» qui reçoit les données de publication devrait simplement fonctionner sur les données, et toute information que vous voulez retourner à l'utilisateur à propos de cette action de publication devrait leur être donnée sur la page vers laquelle vous les redirigez.

[forme] - POST -> [action du contrôleur 'post'] - redirect (302) -> [avec information succès/échec]

2

Quelque chose comme ça a fonctionné pour moi:

public function postAttachment($fileName, $fileMimetype, $fileContents, $postURL, $username, $password) 
{ 
    $auth = base64_encode($username . ':' . base64_decode($password)); 
    $header = array("Authorization: Basic ".$auth); 
    array_push($header, "Accept: */*");  
    $boundary = "----------------------------".substr(md5(rand(0,32000)), 0, 12); 

    $data = ""; 
    $data .= "--".$boundary."\r\n"; 

    //Collect Filedata   
    $data .= "Content-Disposition: form-data; name=\"file\"; filename=\"".$fileName."\"\r\n"; 
    $data .= "Content-Type: ".$fileMimetype."\r\n"; 
    $data .= "\r\n"; 
    $data .= $fileContents."\r\n"; 
    $data .= "--".$boundary."--"; 
    // add more parameters or files here 

    array_push($header, 'Content-Type: multipart/form-data; boundary='.$boundary); 
    $params = array('http' => array( 
     'method' => 'POST', 
     'protocol_version' => 1.1, 
     'user_agent' => 'File Upload Agent', 
     'header' => $header, 
     'content' => $data 
    )); 
    $ctx = stream_context_create($params); 
    $fp = fopen($postURL, 'rb', false, $ctx); 

    if (!$fp) { 
     throw new Exception("Problem with ".$postURL." ".$php_errormsg); 
    } 
    $responseBody = @stream_get_contents($fp); 
    if ($responseBody === false) { 
     throw new Exception("Problem reading data from ".$postURL.", ".$php_errormsg); 
    } 
} 

Si vous souhaitez publier plusieurs fichiers ou ajouter d'autres paramètres en plusieurs parties, il est également facile de les ajouter dans d'autres limites.

J'ai trouvé une partie de ce code sur un autre article, et vous pouvez probablement trouver un code similaire dans le wiki PHP (http://www.php.net/manual/fr/function.stream-context-create.php# 90411). MAIS ... Ce code ne traitait pas correctement le retour chariot + les sauts de ligne et mon serveur rejetait sommairement ce post. En outre, que l'ancien code utilisait également HTTP version 1.0 - (qui ne réutilise pas les sockets). Lors de l'utilisation de HTTP 1.1, les sockets sont réutilisées lors de la publication de nombreux fichiers. (Cela fonctionne aussi avec HTTPS.) J'ai ajouté mon propre agent d'utilisateur - Si vous êtes en train de tromper un serveur en pensant qu'il s'agit d'un message du navigateur, vous pouvez changer l'agent utilisateur pour usurper un navigateur.

Questions connexes