別システムからバッチなどでファイルを作成、そのファイルをNextCloudにアップし、NextCloudの内部リンクを取得したいケースがあった。参考までに方法を示す。
CURLでNextCloudのAPIコマンドをたたき、アップしてFileIDを取得する。
PHPのプログラムで書くと以下の感じとなる。
/** * ローカルのファイルをNextCloudにアップロードし、内部リンクを取得する。 * * @param string $upFileFullPath アップしたいファイルのフルパス * @param string $dstFolder NextClodu上のアップしたいフォルダー(ファイル名は$upFileFullPathのファイル名を使用) * @param string $nextCloudURL NextCloudのURL * @param string $userName NextCloudのログインユーザー * @param string $password NextCloudのログインユーザーのパスワード(アプリパスワード) * @return string|bool ファイルアップ後の内部リンクを返す。falseの場合はエラー */ function upFileAndGetInternalLink($upFileFullPath, $dstFolder, $nextCloudURL, $userName, $password){ if (!is_file($upFileFullPath)){ return false; } $fileName = basename($upFileFullPath); if (substr($nextCloudURL, -1) != '/'){ $nextCloudURL .= '/'; } if (substr($dstFolder, -1) != '/'){ $dstFolder .= '/'; } $apiOfTheUpFile = $nextCloudURL . 'remote.php/dav/files/' . $dstFolder . $fileName; //libxml_use_internal_errors(true); $cmd = "curl -T '" . $upFileFullPath . "' -u '" . $userName . ":" . $password . "' '" . $apiOfTheUpFile . "'"; echo $cmd; $ret = exec($cmd, $aryOutput, $resultCode); if ($ret === false || $resultCode != 0){ return false; } $cmd = "curl -u '" . $userName . ":" . $password . "' '" . $apiOfTheUpFile . "' -X PROPFIND --data '<?xml version=\"1.0\" encoding=\"UTF-8\"?> <d:propfind xmlns:d=\"DAV:\"> <d:prop xmlns:oc=\"http://owncloud.org/ns\"> <oc:fileid /> </d:prop> </d:propfind>'"; $ret = exec($cmd, $aryOutput, $resultCode); if ($ret === false || $resultCode != 0){ return false; } $ret = str_replace(':','',$ret); $xml = simplexml_load_string($ret); $fileId = (string)$xml->dresponse->dpropstat->dprop->ocfileid; return $nextCloudURL . "index.php/f/" . $fileId; }
使用する感じは以下。
$upFileFullPath = '/td/dl/hogehoge.xlsx'; $nextCloudURL = 'https://yourNextCloud.com/'; $dstFolder = '/yourName/All/'; // NextCloudの"data"フォルダ以下を指定。ユーザ名が最初のフォルダ階層になるはず。 $userName = 'YourName'; $password = 'xH6Jk-Hkdje-OPalkd-J4PCn-mqxMW'; echo upFileAndGetInternalLink($upFileFullPath, $dstFolder, $nextCloudURL, $userName, $password);