如何使用 PHP 将文件上载到 Synology 磁盘站



我想发布到 Synology Disksation 并使用 PHP 上传文件。Synology 的 API 给了我一个我想用 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

这是我的代码,我用于帖子:

<?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);
?>

这个调用有效,但磁盘站给了我以下 JSON。

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

根据文档,存在"文件操作的未知错误"。此外,使用"file_get_contents(文件路径("而不是"@".path_to_file会给我同样的磁盘站错误。

如何将文件和参数发布到 Synology 磁盘站?

你能尝试在你的 web api url 中添加_sid,比如 http://ip_of_diskstation:5000/entry.cgi?_sid=

我使用 nodejs 请求库让它工作。

下面是代码:

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>}); 

问候

费利克斯

你会得到:

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

因为官方文件是错误的

有关详细信息,请参阅通过文件上传 API 上传文件。

从我所看到的情况来看,您在CURLOPT_URL中使用的网址需要更新。此外,$params中的文件也需要更新。

一些旁注。确保用户 SID 的设置已正确设置权限。还要确保更新了$_FILES["uploadfile"],以包含您在表单输入元素中使用的任何名称(而不是我使用的 uploadfile(。

请参阅此 github 链接,了解我在哪里找到我的参考。邮递员帮助我在PHP中复制了这一点。

$sid = '_sid=[YOURSID]';
$url = 'HOSTNAME/webapi/entry.cgi?' . $sid;
$SynologySharedPath = 'FILEPATH';
$params = array(
'api' => 'SYNO.FileStation.Upload',
'version' => '2',
'method' => 'upload',
'path' => $SynologySharedPath,
'create_parents' => 'true',
'overwrite' => 'true',
'file' => new CurlFile($_FILES["uploadfile"]["tmp_name"], $_FILES["uploadfile"]["type"], $_FILES['uploadfile']['name'])
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_VERBOSE,true);
$result = curl_exec ($ch);
$curlresponse = json_decode($result, true);

最新更新