FileUpload über PHP an Disksation

knarz

Benutzer
Mitglied seit
17. Jul 2017
Beiträge
5
Punkte für Reaktionen
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
 

TeXniXo

Benutzer
Mitglied seit
07. Mai 2012
Beiträge
4.948
Punkte für Reaktionen
99
Punkte
134
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?
 

knarz

Benutzer
Mitglied seit
17. Jul 2017
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
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.
 

heavygale

Benutzer
Mitglied seit
02. Jun 2012
Beiträge
315
Punkte für Reaktionen
2
Punkte
24
Mal so beim Überfliegen: Du gibst keinen filename an, wie von der API gefordert (siehe Seite 64 der von die verlinkten API-Dokumentation).
 

knarz

Benutzer
Mitglied seit
17. Jul 2017
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
Selbst bei der Angabe von filename wird der 401-Fehler geworfen.
 

knarz

Benutzer
Mitglied seit
17. Jul 2017
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
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.
 

domtor1983

Benutzer
Mitglied seit
21. Okt 2021
Beiträge
1
Punkte für Reaktionen
0
Punkte
1
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;
}
?>
 


 

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