Публикация файлов и папок

Файлы и папки, загруженные на Яндекс Диск, можно опубликовать: сгенерировать ссылку, по которой они будут доступны не только владельцу Диска.

Опубликованным файлам и папкам можно вернуть статус личных — сгенерированные публичные ссылки перестанут работать.

Признак публичности устанавливается и редактируется с помощью метода PROPPATCH. Чтобы опубликовать файл или папку, свойству public_url в пространстве имен urn:yandex:disk:meta следует присвоить любое непустое значение.

Публикация папки

Публикуется папка /public_folder/, расположенная в корневой папке Диска пользователя.

PROPPATCH /public_folder/ HTTP/1.1
User-Agent: my_application/0.0.1
Host: webdav.yandex.ru
Authorization: OAuth 0c4182a7c2cf4521964a72ff57a34a07
Content-Length: 158

<propertyupdate xmlns="DAV:">
  <set>
    <prop>
      <public_url xmlns="urn:yandex:disk:meta">true</public_url>
    </prop>
  </set>
</propertyupdate>

Если папка опубликована успешно, сервер отвечает следующим образом:

HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: 390

<?xml version="1.0" encoding="utf-8"?>
<d:multistatus xmlns:d="DAV:">
  <d:response>
    <d:href>/public_folder/</d:href>
    <d:propstat>
      <d:status>HTTP/1.1 200 OK</d:status>
      <d:prop>
        <public_url xmlns="urn:yandex:disk:meta"> https://yadi.sk/d/AaaBbb1122Ccc </public_url>
      </d:prop>
    </d:propstat>
  </d:response>
</d:multistatus>

Ссылка на опубликованную папку возвращается в значении элемента public_url. Если вы пытаетесь опубликовать уже опубликованную папку, Яндекс Диск возвращает ссылку, сгенерированную при изначальной публикации.

Публикация файла

Публикуется файл readme.txt, расположенный в папке /public_folder/ Диска пользователя.

PROPPATCH /public_folder/readme.txt HTTP/1.1
User-Agent: my_application/0.0.1
Host: webdav.yandex.ru
Authorization: OAuth 0c4182a7c2cf4521964a72ff57a34a07
Content-Length: 158

<propertyupdate xmlns="DAV:">
  <set>
    <prop>
      <public_url xmlns="urn:yandex:disk:meta">true</public_url>
    </prop>
  </set>
</propertyupdate>

Если файл опубликован успешно, сервер отвечает следующим образом:

HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: 400

<?xml version="1.0" encoding="utf-8"?>
<d:multistatus xmlns:d="DAV:">
  <d:response>
    <d:href>/public_folder/readme.txt</d:href>
    <d:propstat>
      <d:status>HTTP/1.1 200 OK</d:status>
      <d:prop>
        <public_url xmlns="urn:yandex:disk:meta"> https://yadi.sk/d/AaaBbb1122Ccc </public_url>
      </d:prop>
    </d:propstat>
  </d:response>
</d:multistatus>

Ссылка на опубликованный файл возвращается в значении элемента public_url. Если вы пытаетесь опубликовать уже опубликованный файл, Яндекс Диск возвращает ссылку, сгенерированную при изначальной публикации.

Закрытие опубликованного файла

Файл readme.txt, расположенный в папке /public_folder/ Диска пользователя, переводится в статус «личный» — свойство public_url удаляется.

PROPPATCH /public_folder/readme.txt HTTP/1.1
User-Agent: my_application/0.0.1
Host: webdav.yandex.ru
Authorization: OAuth 0c4182a7c2cf4521964a72ff57a34a07
Content-Length: 149

<propertyupdate xmlns="DAV:">
  <remove>
    <prop>
      <public_url xmlns="urn:yandex:disk:meta" />
    </prop>
  </remove>
</propertyupdate>

В ответ Яндекс Диск подтвердит, что значение свойства стало пустым:

HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: 336

<?xml version="1.0" encoding="utf-8"?>
<d:multistatus xmlns:d="DAV:">
  <d:response>
    <d:href>/public_folder/readme.txt</d:href>
    <d:propstat>
      <d:status>HTTP/1.1 200 OK</d:status>
      <d:prop>
        <public_url xmlns="urn:yandex:disk:meta" />
      </d:prop>
    </d:propstat>
  </d:response>
</d:multistatus>

При попытке закрыть неопубликованный файл ответ сервера остается таким же: Яндекс Диск сообщает о пустом значении свойства.

Проверка публичности

Проверяется публичность папки /public_folder/: с помощью метода PROPFIND запрашивается значение свойства public_url.

PROPFIND /public_folder/ HTTP/1.1
User-Agent: my_application/0.0.1
Host: webdav.yandex.ru
Authorization: OAuth 0c4182a7c2cf4521964a72ff57a34a07
Depth: 0
Content-Length: 105

<propfind xmlns="DAV:">
  <prop>
    <public_url xmlns="urn:yandex:disk:meta"/>
  </prop>
</propfind>

Если папка опубликована, сервер возвращает публичную ссылку в значении свойства:

HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: 390

<?xml version="1.0" encoding="utf-8"?>
<d:multistatus xmlns:d="DAV:">
  <d:response>
    <d:href>/public_folder/</d:href>
    <d:propstat>
      <d:status>HTTP/1.1 200 OK</d:status>
      <d:prop>
        <public_url xmlns="urn:yandex:disk:meta">
           https://yadi.sk/d/AaaBbb1122Ccc
        </public_url>
      </d:prop>
    </d:propstat>
  </d:response>
</d:multistatus>

Если папка не опубликована, сервер сообщает о пустом значении свойства:

HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: 340

<?xml version="1.0" encoding="utf-8"?>
<d:multistatus xmlns:d="DAV:">
  <d:response>
    <d:href>/public_folder/</d:href>
    <d:propstat>
      <d:status>HTTP/1.1 404 Object Not Found</d:status>
      <d:prop>
        <public_url xmlns="urn:yandex:disk:meta" />
      </d:prop>
    </d:propstat>
  </d:response>
</d:multistatus>