カテゴリー
プログラム 社内SE

NextCloudに外部からファイルをアップし内部リンクを取得する方法

別システムからバッチなどでファイルを作成、そのファイルを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);