Мне нужно проверить, есть ли у меня файл в моем Nextcloud, прежде чем загружать другой (с тем же именем). Я не нашел способа сделать это с помощью curl (команда, которую я использую для загрузки нового файла). Итак, ища в клиентский API Nextcloud, я нашел поиск webDAV.
Я пробовал использовать его перед загрузкой, чтобы проверить, существует ли файл. Вот чего я добился:
curl -u myUser:myPass 'https://nextcloud.customExample.com/remote.php/dav/' -X SEARCH -u myUser:myPass -H "content-Type: text/xml" --data '<?xml version = "1.0" encoding = "UTF-8"?>
<d:searchrequest xmlns:d = "DAV:" xmlns:oc = "http://owncloud.org/ns">
<d:basicsearch>
<d:select>
<d:prop>
<d:displayname/>
</d:prop>
</d:select>
<d:from>
<d:scope>
<d:href>/files/myFolder/myFile.apk</d:href>
<d:depth>infinity</d:depth>
</d:scope>
</d:from>
<d:where>
<d:like>
<d:prop>
<d:getcontenttype/>
</d:prop>
<d:literal>text/%</d:literal>
</d:like>
</d:where>
<d:orderby>
<d:prop>
<oc:size/>
</d:prop>
<d:ascending/>
</d:orderby>
</d:basicsearch>
</d:searchrequest>'
Я получаю эту ошибку при выполнении:
<?xml version = "1.0" encoding = "utf-8"?>
<d:error xmlns:d = "DAV:" xmlns:s = "http://sabredav.org/ns">
<s:exception>Sabre\DAV\Exception\NotFound</s:exception>
<s:message>Principal with name myFolder not found</s:message>
</d:error>
Папка myFolder, как я вижу, находится в корне моего Nextcloud. Я не знаю, нужно ли мне что-то еще добавить перед этим (поскольку я добавил «файлы»).
У пользователя есть разрешения, и использование команды curl для загрузки файла с этим же пользователем работает.
В конце концов, я нашел более простой способ проверить, существует ли файл:
url='http://example.com/index.html'
if ( curl -o/dev/null -sfI "$url" ); then
echo "URL exists"
else
echo "URL does not exist"
fi
К этой команде curl вы можете добавить параметр --user
, если вам нужна аутентификация.
Нашел здесь.