FileUpload über PHP an Disksation

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

knarz

Benutzer
Registriert
17. Juli 2017
Beiträge
5
Reaktionspunkte
0
Punkte
0
Hallo zusammen,

ich hoffe, dass ich hier jemanden finden, der eine Lösung zu meinem Problem hat. Das Problem ist das folgende. Ich versuche für ein Projekt über ein PHP-Skript eine Datei auf die Diskstation hochzuladen.

In der API-Dokumentation gibt es bei der FileStation einen entsprechenden Endpoint.
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

Hier mein PHP-Code

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

$ch = curl_init();

$BODY = http_build_query($params);
curl_setopt($ch, CURLOPT_URL, 'http://ip_der_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);
?>

Aber ich erhalte von der Diskstation die folgende JSON.

{"error":{"code":401},"success":false}

Nach der Doku bedeutet hier der Fehler 401 "Unknown error of file operation". Ich gehe davon aus, dass die Datei nicht von der Diskstation verarbeitet oder nicht gefunden wurde.

Hat jemand eine Ahnung, wie der Upload zur Diskstation mit PHP funktioniert oder kennt jemand eine Alternative, aber trotzdem mit PHP.

VIelen Dank schonmal
 
Generell kann man auf der DS diverse PHP-Seiten aufrufen.

Hast du auch PHP-Pakete 5.x und/oder 7.x via Paketzentrum installiert? phpmyadmin ist eh sicher drauf (MariaDB o.ä.). Wo befinden sich diese Skripts auf der DS?
 
Auf der Diskstation wird das PHP-Skript nicht ausgeführt sondern von einem externen Webserver, der sich im selben Netzwerk befindet. Die anderen API-Enpoints, wie "CreateFolder" oder "Rename" über den externen Server funktionieren.
Nur beim Upload hakt es.
 
Mal so beim Überfliegen: Du gibst keinen filename an, wie von der API gefordert (siehe Seite 64 der von die verlinkten API-Dokumentation).
 
Selbst bei der Angabe von filename wird der 401-Fehler geworfen.
 
Ich habe jetzt vorerst eine Lösung über FTP gefunden, die funktioniert. Aber würde eher bevorzugen es über den Endpoint "SYNO.FileStation.Upload" zu realisieren.
Da über den Endpoint der Vorteil besteht, dass die Parents der Ordner-Struktur erstellt werden, wenn diese nicht vorhanden sind. Dieser fehlt bei der FTP-Lösung.

Ich hoffe, dass sich hier noch eine Lösung über die Diskstation-API ergibt.
 
Servus,

Möchte es auch über php durchführen und es funktionierte nicht, hab es dann richtig geschrieben nach vorgabe der synology pdf.

Denke es kann sicher mal wer benötigen.

PS:
Ich würde bei höherer Frequenz ein Cookiefile beim Login anlegen.
Ist es abgelaufen kommt die antwort error code 119, ist dies der Fall einfach neu einloggen, cookiefile speichern und nochmals durchführen.
Spart deutlich an Zeit und Ressourcen.

PHP:
<?php
$s_url = 'NAS_SCHEMA://NAS-IP:NAS-PORT/webapi/entry.cgi';
$s_coo = '/tmp/cookie_synoWebAPI'; # I prefer cookie file, with long sassion timeout you have only one web api login for days, if you get error code 119 - auth again and safe cookie
$s_pf = '/PATH/FILE'; # local file to copy
$s_pn = '/SHARENAME/SUB'; # destination folder
$s_fn = 'FILENAME'; # destination file name
$s_uniqid = uniqid();
$a_fields = array('api' => 'SYNO.FileStation.Upload', 'version' => '2', 'method' => 'upload', 'create_parents' => 'false', 'overwrite' => 'false', 'path' => $s_pn);
$postData = build_postData($s_uniqid, $a_fields, $s_fn, $s_pf);
$headers = ['Content-Length: ' . strlen($postData), 'Content-Type: multipart/form-data; boundary=' . $s_uniqid];

$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); # optional
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); # optional
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_URL, $s_url);
curl_setopt($ch, CURLOPT_COOKIEFILE, $s_coo);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

ob_start();
$a_ret = curl_exec($ch);
ob_end_clean();
$a_info = curl_getinfo($ch);
curl_close($ch);

function build_postData ($s_uniqid, $a_fields, $s_fn, $s_pf) {
    $eol = "\r\n";
    # append fields
    foreach ($a_fields as $name => $content) {
        $postData .=
            '\--' . $s_uniqid . $eol
            . 'Content-Disposition: form-data; name="' . $name . "\"" . $eol . $eol
            . $content . $eol;
    }
    # append file
    $postData .=
        '\--' . $s_uniqid . $eol
        . 'Content-Disposition: form-data; name="file"; filename="' . $s_fn . '"' . $eol
        . 'Content-Type: application/octet-stream' . $eol
        . $eol
        . file_get_contents(realpath($s_pf)) . $eol
        . '\--' . $s_uniqid . '--' . $eol;

    return $postData;
}
?>
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat