【问题标题】:How can I upload a file to a Synology diskstation with PHP如何使用 PHP 将文件上传到 Synology 磁盘站
【发布时间】:2017-12-21 13:48:22
【问题描述】:

我想发布到 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);
    ?>

此调用有效,但 diskstation 为我提供了以下 JSON。

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

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

如何将文件和参数发布到 Synology Diskstation?

【问题讨论】:

  • 401 状态码通常表示Unauthorized。你对_sid的价值有信心吗?在使用此 API 之前,您是否需要在 Diskstation 上启用某些功能?
  • 在调用“http://[ip_of_diskstation]:5000/webapi/auth.cgi ?api=SYNO.API.Auth&version=2&method=login&account=[用户名]&passwd=[pass]&session=DownloadStation&format=cookie"。我在上面的代码中用于上传调用的这个“sid”。在 Synology API 的文档中,401 的含义与 HTTP 中的含义不同。 global.download.synology.com/download/Document/DeveloperGuide/…
  • 你有没有得到这个工作?

标签: php file curl upload synology


【解决方案1】:

您可以尝试在您的网络 api 网址中添加 _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>}); 

问候,

菲利克斯

【讨论】:

    【解决方案2】:

    你得到:

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

    因为官方文档有误

    详情请见Upload file through FileStation upload api

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 2016-02-20
      • 2019-04-04
      • 2018-09-14
      • 2012-08-18
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多