2017-07-17 7 views
0

Je souhaite publier un fichier sur une Synology Disksation et télécharger un fichier avec PHP. L'API de Synology me donne une interface que je veux appeler avec PHP. Voir la documentation ci-dessous.Comment puis-je télécharger un fichier sur une station de base Synology avec PHP

https://global.download.synology.com/download/Document/DeveloperGuide/Synology_File_Station_API_Guide.pdf#%5B%7B%22num%22%3A111%2C%22gen%22%3A0%7D%2C%7B%22name%22%3A%22XYZ%22%7D%2C69%2C711%2C0%5D

Voici mon code, que je l'utilise pour le poste:

<?php 
     $params = array(
      'path' => '/home/upload', 
      'create_parents' => 'true', 
      'overwrite' => 'true', 
      'api' => 'SYNO.FileStation.Upload', 
      'version' => 2, 
      'method' => 'upload' 
      '_sid' => [id of session after authenticate], 
      'file[]' => "@".path_to_file 
     ); 

     $ch = curl_init(); 

     $BODY = http_build_query($params); 
     curl_setopt($ch, CURLOPT_URL, 'http://ip_of_diskstation:5000/entry.cgi'); 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $BODY); 
     curl_setopt($ch, CURLOPT_HEADER, 0); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

     $result = curl_exec($ch); 
     $info = curl_getinfo($ch); 
     curl_close($ch); 

     var_dump($result); 
    ?> 

Cela fonctionne d'appel, mais le DiskStation me donne le JSON suivant. Selon la documentation, il existe une "Erreur inconnue lors du fonctionnement du fichier". En outre, en utilisant "file_get_contents (chemin d'accès au fichier)" au lieu de "@". Path_to_file me donne la même erreur à partir de la station de disque.

Comment puis-je publier un fichier et des paramètres sur une station de synchronisation?

+0

'' 401' signifie généralement Unauthorized'. Êtes-vous confiant dans la valeur de '_sid'? Avez-vous besoin d'activer quelque chose sur le Diskstation avant d'utiliser cette API? – BeetleJuice

+0

Je reçois le JSON {"données": "sid": "5RXTvhuc0fuuY1420LUN005590"}, "succès": true} après avoir appelé "http: // [ip_of_diskstation]: 5000/webapi/auth.cgi? Api = SYNO.API. Auth & version = 2 & méthode = login & account = [nom d'utilisateur] & passwd = [passe] & session = DownloadStation & format = cookie ". Ce "sid" j'utilise pour l'appel de téléchargement dans le code ci-dessus. Dans la documentation de l'API Synology, 401 a une signification différente de HTTP. https://global.download.synology.com/download/Document/DeveloperGuide/Synology_File_Station_API_Guide.pdf#page=9&zoom=auto,-278,769 – knarz

Répondre

0

Pouvez-vous essayer d'ajouter _sid dans votre web url api comme http://ip_of_diskstation:5000/entry.cgi?_sid=

Je fais du travail avec nodejs demander bibliothèque.

Voici le code:

  let r = request.post({ url: `${web_url}/entry.cgi?_sid=${sid}` }, (err, response, body) => { 
       return callback(err, response); 
      }); 
      let form = r.form(); 
      form.append('api', 'SYNO.FileStation.Upload'); 
      form.append('version', '2'); 
      form.append('method', 'upload'); 
      form.append('overwrite', 'false'); 
      form.append('path', '<shared folder path>'); 
      form.append('create_parents', 'true'); 
      form.append('_sid', sid); 
      form.append('file', fs.createReadStream(file), { 'filename' : <filename without the path>}); 

Cordialement,

code d'état Felix