Как отправить файлы через mail ru файлы

Обновлено: 04.07.2024

Анх_21

rgd1101

Титан

Анх_21

rgd1101

Титан
< td > C < tr > td> < td > B < td >1 < td >1
Начало темы Похожие темы Форум Ответы Дата
J Решено! Скачал Битлорд. Социальные сети 2 26 февраля 2019 г.
Facebook не может опубликовать ссылку на мой сайт , Почему? Социальные сети 4 7 января 2019 г.
N Загрузить файлы размером более 4 ГБ в Cloud Mail Ru Социальные сети 9 27 октября 2018 г.
Загрузка изображения из Instagram Социальные сети 12 3 октября 2018 г.
P Решено! Лучший способ скачать альбомы FB в 2018 году? Социальные сети 1 3 октября 2018 года
L Какой пульт я могу загрузить для использования со старой телевизионной приставкой Magnavox, не смарт-телевизором? Социальные сети 1 24 августа 2018 г.
A Whatsapp 32-bit win 10 проблема Социальные сети 1 20 июля 2018 г.
G Интернет 20 Мбит/с, но скорость загрузки всего 3 Мбит/с Социальные сети< /td> 3 10 июля 2018 г.
A Решено! Авторские права YouTube, кто-нибудь может мне помочь? Социальные сети 3 14 июня 2018 г.
S Плохое качество воспроизведения прямых трансляций Facebook, когда я их загружаю? Социальные сети 3 17 мая 2018 г.
G Решено! Как загрузить данные facebook без учетной записи facebook? Социальные сети 2 11 апреля 2018 г.
Как перезагрузить телефон Я пытался загрузить какое приложение, оно говорит нет подключения Социальные сети 1 Jan 24, 2018
R Прекратить удаление файлов, которые останавливаются при загрузке Социальные сети 2< /td> 9 января 2018 г.
B Скорость интернета, пожалуйста, помогите Социальные сети 15 декабря 2017 г.
Видео на Youtube заблокировано в зависимости от страны, как смотреть Социальные сети 15 октября 2017 г.
A не удается создать копию файла на Google Диске Социальные сети 2 14 октября 2017 г.
H Нужен компьютерная программа, которая считает слова в нескольких файлах TXT! Социальные сети 4 S ep 30, 2017
B загрузка огромного количества видео с веб-сайта Социальные сети 3 10 августа 2017 г.
Прямая трансляция на YouTube . нужна помощь . Социальные сети 3 7 июля 2017 г.
T Интернет со скоростью 1 Гбит/с, но скорость очень низкая Социальные сети 9 8 октября 2016 г.

ПОПУЛЯРНЫЕ ТРЕКИ

  • Инициатор Jwnt11
  • 11 февраля 2022 г.
  • Ответов: 2
  • Начато Turntables090
  • Сегодня в 15:01
  • Ответов: 0
  • Инициировано mgistr
  • Сегодня в 10:00
  • Ответов: 0
  • Инициатор dnu318
  • Сегодня в 9:36
  • Ответов: 3
  • Инициатор Jimmymo21
  • Вчера в 16:07
  • Ответов: 0
  • Инициатор: Felix_alex3719
  • Вчера в 17:46
  • Ответов: 1
  • Инициатор Миран Фирдоуси.
  • Сегодня в 6:57
  • Ответов: 0

Модераторы онлайн

Поделиться этой страницей

Tom's Guide является частью Future plc, международной медиагруппы и ведущего цифрового издателя. Посетите наш корпоративный сайт.
© Future Publishing Limited Quay House, Амбери, Бат BA1 1UA.
Все права защищены. Регистрационный номер компании в Англии и Уэльсе 2008885.


Tom's Guide является частью Future plc, международной медиа-группы и ведущего цифрового издателя. Посетите наш корпоративный сайт.
© Future Publishing Limited Quay House, Амбери, Бат BA1 1UA. Все права защищены. Регистрационный номер компании в Англии и Уэльсе 2008885.

Эндрю Сумин

На индексы и тела приходится только 15 % объема хранилища, тогда как 85 % занимают файлы. Итак, оптимизацию файлов (то есть вложений) стоит изучить подробнее.В то время у нас не было дедупликации файлов, но мы подсчитали, что это может уменьшить общий размер хранилища на 36%, потому что многие пользователи получают одни и те же сообщения, такие как прайс-листы из интернет-магазинов и информационные бюллетени из социальных сетей, которые содержать изображения и так далее. В этой статье я опишу, как мы внедрили систему дедупликации под руководством PSIAlt.

Дополнительная литература на SmashingMag:

Познакомьтесь с «TypeScript в 50 уроках», нашим новым блестящим руководством по TypeScript. С подробными пошаговыми руководствами по коду, практическими примерами и распространенными ошибками — все разбито на короткие, понятные уроки. Для разработчиков, которые достаточно знают JavaScript, чтобы быть опасными.

Хранение метаданных

Мы имеем дело с потоком файлов. Когда мы получаем сообщение, мы должны доставить его пользователю как можно скорее. Нам нужно уметь быстро распознавать дубликаты. Простым решением было бы назвать файлы на основе их содержимого. Мы используем SHA-1 для этой цели. Исходное имя файла хранится в самом письме, поэтому нам не нужно об этом беспокоиться.

После получения нового электронного письма мы извлекаем файлы, вычисляем их хэши и добавляем результат в электронное письмо. Это необходимый шаг, чтобы иметь возможность легко находить файлы, принадлежащие определенному электронному письму, в нашем будущем хранилище, когда это электронное письмо будет отправлено.

Теперь давайте загрузим файл в наше хранилище и выясним, существует ли там уже другой файл с таким же хешем. Это означает, что нам нужно хранить все хэши в памяти. Назовем это хранилище хэшей FileDB.

Один файл можно прикрепить к разным электронным письмам, поэтому нам понадобится счетчик, который отслеживает все электронные письма, содержащие этот файл.

Счетчик увеличивается с каждым новым загружаемым файлом. Около 40% всех файлов удаляются, поэтому, если пользователь удаляет электронное письмо, содержащее файлы, загруженные в облако, счетчик должен быть уменьшен. Если счетчик достигает нуля, файл можно удалить.

Здесь мы сталкиваемся с первой проблемой: информация об электронном письме (индексы) хранится в одной системе, а информация о файле — в другой. Это может привести к ошибке. Например, рассмотрим следующий рабочий процесс:

  1. Система получает запрос на удаление сообщения электронной почты.
  2. Система проверяет индексы электронной почты.
  3. Система видит наличие вложения (SHA-1).
  4. Система отправляет запрос на удаление файла.
  5. Происходит сбой, поэтому письмо не удаляется.

В этом случае письмо остается в системе, но счетчик уменьшается на 1. Когда система получает второй запрос на удаление этого письма, счетчик снова уменьшается, и мы можем столкнуться с ситуацией, когда файл все еще прикреплен к электронному письму, но счетчик уже равен 0.

Не потерять данные очень важно. У нас не может быть ситуации, когда пользователь открывает электронное письмо и не обнаруживает там вложений. При этом хранение некоторых избыточных файлов на дисках не имеет большого значения. Все, что нам нужно, — это механизм, позволяющий однозначно определить, правильно ли счетчик установлен на 0. Поэтому у нас есть еще одно поле — magic .

Алгоритм прост. Вместе с хэшем файла мы храним в электронном письме случайно сгенерированное число. Все запросы на загрузку или удаление файла учитывают это случайное число: в случае запроса на загрузку это число добавляется к текущему значению магического числа; если это запрос на удаление, это случайное число вычитается из текущего значения магического числа.

Таким образом, если все электронные письма увеличивали и уменьшали счетчик нужное количество раз, то магическое число также будет равно 0. В противном случае файл нельзя удалять.

Давайте рассмотрим пример. У нас есть файл с именем sha1. Он загружается один раз, и письмо генерирует для него случайное (магическое) число, равное 345.

Затем приходит новое электронное письмо с тем же файлом. Он генерирует собственное магическое число (123) и загружает файл. Новое магическое число добавляется к текущему значению магического числа (345), а счетчик увеличивается на 1. В результате в FileDB мы имеем магическое число со значением 468 и счетчиком, установленным на 2. .

После того как пользователь удалит второе электронное письмо, магическое число, сгенерированное для этого электронного письма, вычитается из текущего значения магического числа (468), а счетчик уменьшается на 1.

Давайте сначала посмотрим на обычный ход событий. Пользователь удаляет первое электронное письмо, и магическое число и счетчик становятся равными 0. Это означает, что данные непротиворечивы и файл можно удалить.

Теперь предположим, что что-то пошло не так: второе письмо отправляет два запроса на удаление. Значение счетчика, равное 0, означает, что ссылок на файл больше нет, но магическое число, равное 222, сигнализирует о проблеме: файл нельзя удалить, пока данные не будут согласованы.

Давайте еще немного разовьем ситуацию. Предположим, что первое электронное письмо также было удалено.В этом случае магическое число (-123) по-прежнему сигнализирует о несоответствии.

В качестве меры предосторожности, когда счетчик достигает 0, а магическое число — нет (в нашем случае магическое число — 222, а счетчик — 0), файлу присваивается флаг «Не удалять». Таким образом, даже если — после серии удалений и загрузок — и магическое число, и счетчик каким-то образом станут 0, мы все равно будем знать, что этот файл проблемный и его нельзя удалять. Системе не разрешено генерировать магический узел 0. Если вы отправите 0 в качестве магического числа, вы получите сообщение об ошибке.

Вернуться к FileDB. Каждая сущность имеет набор флагов. Планируете ли вы их использовать или нет, они вам понадобятся (например, если файл необходимо пометить как неудаляемый).

У нас есть все атрибуты файла, за исключением того, где файл находится физически. Это место определяется сервером (IP) и диском. Таких серверов и два таких диска должно быть два. Мы храним две копии каждого файла.

Но на одном диске хранится очень много файлов (в нашем случае около 1 миллиона), а значит, эти записи будут идентифицироваться одной и той же парой дисков в FileDB, поэтому хранить эту информацию в FileDB было бы расточительно. Поместим его в отдельную таблицу PairDB, связанную с FileDB через идентификатор пары дисков.

Полагаю, само собой разумеется, что помимо идентификатора пары дисков нам также понадобится поле флагов. Забегая немного вперед, упомяну, что это поле сигнализирует о том, заблокированы ли диски (скажем, один диск вышел из строя, а другой копируется, поэтому ни на один из них нельзя записать новые данные).

Кроме того, нам нужно знать, сколько свободного места есть на каждом диске, а значит, и соответствующие поля.

Чтобы все работало быстро, FileDB и PairDB должны быть резидентными в оперативной памяти. Раньше мы использовали Tarantool 1.5, теперь нужно использовать последнюю версию. FileDB имеет пять полей (длиной 20, 4, 4, 4 и 4 байта), что в сумме дает 36 байтов. Кроме того, каждая запись имеет 16-байтовый заголовок и 1-байтовый указатель длины для каждого поля, в результате чего общий размер записи составляет 57 байт.

Tarantool позволяет указать минимальный размер выделяемой памяти, поэтому накладные расходы, связанные с памятью, могут быть близки к нулю. Мы будем выделять точное количество памяти, необходимое для одной записи. У нас 12 миллиардов файлов.

(57 * 12 * 10^9) / (1024^3) = 637 ГБ

Но это еще не все, нам также понадобится индекс для поля sha1, который добавляет еще 12 байт к общему размеру записи.

(12 * 12 * 10^9) / (1024^3) = 179 ГБ

Всего требуется 800 ГБ оперативной памяти. И давайте не будем забывать о репликации, которая удваивает требуемый объем оперативной памяти.

Если мы купим машины с 256 ГБ ОЗУ, нам понадобится восемь таких машин.

Мы можем оценить размер PairDB. Средний размер файла составляет 1 МБ, а емкость диска — 1 ТБ, что позволяет хранить около 1 миллиона файлов на одном диске; Итак, нам потребуется около 28 000 дисков. Одна запись PairDB описывает два диска. Таким образом, PairDB содержит 14 000 записей — ничтожно мало по сравнению с FileDB.

Загрузка файла

Теперь, когда мы разобрались со структурой базы данных, давайте обратимся к API для взаимодействия с системой. На первый взгляд, нам нужны методы загрузки и удаления. Но не забывайте о дедупликации: велика вероятность, что файл, который мы пытаемся загрузить, уже находится в хранилище, и загружать его второй раз не имеет смысла. Итак, необходимы следующие методы:

Давайте подробнее рассмотрим, что происходит во время загрузки. Для демона, реализующего этот интерфейс, мы выбрали протокол IProto. Демоны должны хорошо масштабироваться для любого количества машин, поэтому они не сохраняют состояния. Предположим, мы получаем запрос через сокет:

Имя команды сообщает нам длину заголовка, поэтому мы сначала читаем заголовок. Теперь нам нужно узнать длину файла origin-len. Для его загрузки необходимо выбрать пару серверов. Мы просто извлекаем все записи (несколько тысяч) из PairDB и используем стандартный алгоритм для поиска нужной пары: Берем отрезок длиной, равной сумме свободных мест на всех парах, случайным образом выбираем точку на этом отрезке, и выберите любую пару, к которой принадлежит эта точка.

Однако такой выбор пары сопряжен с риском. Предположим, что все наши диски заполнены на 90% — и тогда мы добавляем новый пустой диск. С большой долей вероятности все новые файлы будут загружаться на этот диск. Чтобы избежать этой проблемы, мы должны суммировать не свободное пространство пары дисков, а n-й корень этого свободного места.

Итак, мы выбрали пару, но наш демон потоковый, и если мы начинаем загружать файл в хранилище, пути назад нет. При этом перед загрузкой реального файла мы сначала загрузим небольшой тестовый файл. Если тестовая загрузка прошла успешно, мы прочитаем содержимое файла из сокета и загрузим его в хранилище; в противном случае выбирается другая пара. Хэш SHA-1 можно считывать на лету, поэтому он также проверяется при загрузке.

Теперь рассмотрим загрузку файла из загрузчика на выбранную пару дисков.На машинах с дисками настраиваем nginx и используем протокол WebDAV. Приходит электронное письмо. В FileDB пока нет этого файла, поэтому его необходимо загрузить на пару дисков через загрузчик.

Но ничто не мешает другому пользователю получить то же электронное письмо — допустим, указаны два получателя. Помните, что FileDB еще не имеет этого файла, поэтому еще один загрузчик будет загружать этот самый файл и может выбрать ту же пару дисков для загрузки.

Nginx, скорее всего, разрешит эту ситуацию правильно, но нам нужно контролировать весь процесс, поэтому мы сохраним файл со сложным именем.

Красная часть имени — это место, где каждый загрузчик помещает случайное число. Таким образом, два метода PUT не будут перекрываться и загружать два разных файла. Как только nginx отвечает 201 (ОК), первый загрузчик выполняет атомарную операцию MOVE, которая указывает окончательное имя файла.

Когда второй загрузчик завершит загрузку файла и также выполнит MOVE , файл будет перезаписан, но в этом нет ничего страшного, поскольку это один и тот же файл. Как только файл окажется на дисках, необходимо добавить новую запись в FileDB. Наша версия Tarantool разделена на два пространства. До сих пор мы использовали только пробел 0.

Однако вместо простого добавления новой записи в FileDB мы используем хранимую процедуру, которая либо увеличивает счетчик файлов, либо добавляет новую запись в FileDB. Почему? За то время, которое прошло с тех пор, как загрузчик убедился, что файл не существует в FileDB, загрузил его и приступил к добавлению новой записи в FileDB, кто-то другой мог загрузить этот файл и добавить соответствующую запись. Мы рассмотрели именно такой случай: на одно письмо указываются два получателя, поэтому загружать файл начинают два загрузчика; как только второй загрузчик завершает загрузку, он также добавляет новую запись в FileDB.

В этом случае второй загрузчик просто увеличивает счетчик файлов.

Теперь рассмотрим метод dec. У нашей системы есть две первоочередные задачи: надежно записать файл на диск и быстро отдать его клиенту с этого диска. Физическое удаление файла создает определенную нагрузку и замедляет выполнение этих двух задач. Вот почему мы выполняем удаление в автономном режиме. Сам метод dec уменьшает значение счетчика. Если последнее становится равным 0, как и магическое число, то это означает, что файл больше никому не нужен, поэтому мы перемещаем соответствующую запись из пробела 0 в пробел 1 в Tarantool.

Валькирия

В каждом хранилище есть демон Valkyrie, который отслеживает целостность и согласованность данных и работает с пространством1. На каждый диск приходится один экземпляр демона. Демон перебирает все файлы на диске и проверяет, содержит ли space1 запись, соответствующую определенному файлу, что означает, что этот файл следует удалить.

Но после вызова метода dec и перемещения файла в space1 Valkyrie может потребоваться некоторое время, чтобы найти этот файл. Это означает, что в промежутке между этими двумя событиями файл может быть перезалит и, таким образом, снова перемещен в space0.

Вот почему Valkyrie также проверяет, существует ли файл в space0 . Если дело обстоит именно так и пара_ид соответствующей записи указывает на пару дисков, на которых работает этот экземпляр Valkyrie, то запись удаляется из пространства1.

Если в space0 не найдено ни одной записи, то файл является потенциальным кандидатом на удаление. Однако между запросом к space0 и физическим удалением файла все еще есть временное окно, в котором новая запись, соответствующая этому файлу, может появиться в space0. Чтобы справиться с этим, мы помещаем файл в карантин.

Вместо удаления файла мы добавляем к его имени удаленный и временную метку. Это означает, что мы физически удалим файл с отметкой времени плюс некоторое время, указанное в файле конфигурации. Если произойдет сбой и файл будет удален по ошибке, пользователь придет, чтобы вернуть его. Мы сможем восстановить его и решить проблему без потери данных.

Теперь вспомним, что есть два диска, на каждом из которых работает экземпляр Valkyrie. Два экземпляра не синхронизированы. Отсюда вопрос: Когда запись должна быть удалена из space1?

Мы сделаем две вещи. Во-первых, для рассматриваемого файла давайте сделаем один из экземпляров Valkyrie мастером. Это легко сделать, используя первый бит имени файла: если он равен нулю, то disk0 является мастером; в противном случае disk1 является ведущим.

Давайте введем задержку обработки. Вспомните, что когда запись находится в space0, она содержит волшебное поле для проверки непротиворечивости. При перемещении записи в space1 это поле не используется, поэтому мы поместим туда временную метку, соответствующую времени появления этой записи в space1. Таким образом, главный экземпляр Valkyrie сразу начнет обработку записей в пространстве 1, тогда как подчиненный добавит некоторую задержку к метке времени и немного позже обработает и удалит записи из пространства 1.

У этого подхода есть еще одно преимущество.Если файл был ошибочно помещен в карантин на мастере, это будет видно из журнала, как только мы запросим мастер. Тем временем клиент, запросивший файл, вернется к ведомому — и пользователь получит нужный файл.

Итак, мы рассмотрели ситуацию, в которой демон Valkyrie находит файл с именем sha1, и этот файл (являющийся потенциальным кандидатом на удаление) имеет соответствующую запись в space1. Какие еще варианты возможны?

Предположим, файл находится на диске, но в FileDB нет соответствующей записи. Если в рассмотренном выше случае мастер-инстанс Valkyrie по каким-то причинам какое-то время не работал, значит, у слейва было достаточно времени, чтобы поместить файл в карантин и удалить соответствующую запись из space1 . В этом случае мы также помещаем файл в карантин, используя sha1.deleted.timestamp .

Другая ситуация: запись существует, но указывает на другую пару дисков. Это могло произойти во время загрузки, если для одного письма указаны два получателя. Вспомните эту схему:

Что произойдет, если второй загрузчик загрузит файл в другую пару, чем первый? Он увеличит счетчик в space0 , но пара дисков, на которую был загружен файл, будет содержать несколько ненужных файлов. Что нам нужно сделать, так это убедиться, что эти файлы можно прочитать и что они соответствуют sha1. Если все в порядке, такие файлы можно сразу удалить.

Кроме того, Valkyrie может обнаружить файл, помещенный в карантин. Если карантин закончится, этот файл будет удален.

Осталась последняя ситуация, связанная с проблемами с диском. Если в ходе системного мониторинга выявляется какая-либо проблема с диском, проблемный диск переводится в сервисный (только для чтения) режим, а на втором диске выполняется операция UNMOVE. Это эффективно распределяет все файлы на втором диске между другими парами дисков.

Результат

Вернемся к тому, с чего начали. Раньше наше хранилище электронной почты выглядело так:

После внедрения новой системы нам удалось уменьшить общий размер на 18 ПБ:

О SHA-1

На данный момент нет известных примеров коллизий SHA-1. Однако существуют примеры коллизий для его внутренней функции сжатия (коллизия свободного запуска SHA-1). Учитывая 12 миллиардов файлов, вероятность конфликта хэшей меньше 10^-38.

Но давайте предположим, что это возможно. В этом случае, когда файл запрашивается по его хеш-значению, мы проверяем, имеет ли он правильный размер и контрольную сумму CRC32, которые были сохранены в индексах соответствующего письма при загрузке. То есть запрошенный файл будет предоставлен только в том случае, если он был загружен вместе с этим письмом.

Облако Mail.Ru: Сохраните свои фотографии на ПК

Облако Mail.Ru: Сохраните свои фотографии на ПК

Облако Mail.Ru: Сохраните свои фотографии на ПК

Облако Mail.Ru: Сохраните свои фотографии на ПК

Информация об игре

Облако Mail.Ru: Сохраните фото в безопасности на ПК

<р>1. Загрузите установщик MEmu и завершите настройку

Облако Mail.Ru: Сохраните фото в безопасности на ПК

<р>2. Запустите MEmu, затем откройте Google Play на рабочем столе

Облако Mail.Ru: Сохраните фото в безопасности на ПК

Установить

<р>5. По завершении установки нажмите на значок, чтобы начать

Облако Mail.Ru: Сохраните фото в безопасности на ПК

MEmu Play – лучший эмулятор Android, и 100 миллионов человек уже наслаждаются его великолепными играми на Android. Технология виртуализации MEmu позволяет без проблем играть в тысячи игр для Android на ПК, даже в самые требовательные к графике игры.

Большой экран с лучшей графикой; Длительная продолжительность без ограничения заряда батареи или мобильных данных.

Полная поддержка раскладки клавиш для точного управления клавиатурой и мышью или геймпадом.

Несколько игровых учетных записей или задач на одном ПК одновременно с помощью диспетчера нескольких окон.


Несколько месяцев назад случилось неизбежное - мой жесткий диск с архивом приказал долго жить. К счастью, к тому времени все файлы были скопированы в облако и ничего не потерялось.

После покупки нового диска я переустановил облачный клиент и дождался загрузки моих файлов. Но через пару минут увидел, что на диске ничего не появилось, но файлы быстро удалились из Облака.

В конце статьи есть UPD, UPD2 , UPD3 и UPD4, в которых описаны причины такого поведения.
ТЛ; ДР: ложная тревога, с файлами и синхронизацией все в порядке, но пользовательский интерфейс и работа тех. поддержка нуждается в дальнейшем развитии.

Как выяснилось после общения с тех. поддержки, это стандартное поведение клиента - какую бы папку вы ему не скармливали, он начинает ее синхронизировать с облаком, удаляя оттуда все, что не находится в папке.

Загрузка файлов через WebDav также невозможна: и все такое


Остается возможность загрузки файлов через веб-интерфейс. Файлы туда можно скачивать по одному, а можно выбрать несколько файлов или папок и скачать их одним архивом, что довольно удобно. Единственным ограничением является то, что размер архива не может превышать 4 ГБ.


Я пытался пойти этим путем, но быстро понял, что это очень неудобный вариант:

  • Ограничение в 4 гигабайта означает, что если у вас есть около терабайта в облаке, вам придется загрузить не менее 250 архивов.
  • Каждый архив нужно создавать вручную, выбирая папки, считая их общий размер и отмечая уже скачанные.
  • Иногда архивы не открываются по неизвестной причине.
  • Структура папок потеряна.

Первое, что вам нужно понять, это как получить список папок и файлов. Изначально я планировал просто разобрать страницы, выдрать из них информацию о папках и файлах и построить дерево. Но, открыв исходный код страницы, я сразу увидел, что весь интерфейс для работы с документами построен через javascript, что, если подумать, очень логично.

Поэтому у меня было два возможных решения: подключить
Selenium и все равно построить дерево из html или разобраться с внутренним API, который используется в скрипте.

Я выбрал второй путь, как наиболее разумный — зачем парсить что-то сторонними инструментами, если у вас уже есть готовый API?
К счастью, скрипт не был запутан и даже не сжат - мне были доступны оригинальные имена переменных и функций и комментарии разработчиков, это значительно облегчило задачу.

После нескольких минут изучения я увидел, что все доступные методы API описаны в виде массива:



Поэтому я не трачу время в своем коде на красивое форматирование — кто-нибудь его обязательно сломает.

Открываем страницу в браузере и видим такой ответ:


Очевидно, вам необходимо авторизоваться на портале. Авторизуйтесь, повторите запрос и увидите еще одну ошибку:


Неудивительно, что для выполнения запросов API требуется токен. В списке методов есть два подходящих метода: tokens/csrf и tokens/download .

Запрашиваем, добавляем в вызов метода папки параметр ?token=X9ccJNwYeowQTakZC1yGHsWzb7q6bTpP и получаем новую ошибку:


Здесь мне пришлось снова прочитать источник, чтобы узнать, какие аргументы принимает этот метод. Оказалось, что в параметре home нужно указать папку, содержимое которой мы хотим получить.


Информация о файлах и каталогах — это то, что вам нужно!

Функциональность API подтверждена, схема его работы понятна — можно приступать к написанию программы. Я решил написать консольное приложение на php, так как хорошо знаю этот язык. Компонент Console от Symfony идеально подходит для этой задачи. Я уже писал консольные команды для Laravel, которые построены именно на этом компоненте, но там уровень абстракции достаточно высок и напрямую с ним я не работал, поэтому решил, что пора познакомиться поближе. /p>

Не буду пересказывать документацию, она достаточно подробная и очень простая. Ничего не зная о компоненте, я несколько часов писал вот такие простенькие интерфейсы:



Так выглядит приложение в процессе загрузки файлов.



И так в конце: выводится небольшая табличка (максимум 100 строк) с информацией о скачанных файлах. Никакой практической пользы это не несет и сделано исключительно в образовательных целях.

Структура консольного приложения может включать несколько команд , вызванных следующим: аргумент команды php app.php --option . Но для моих целей мне нужна только одна команда и я хотел бы начать загрузку следующим образом: php app.php arguments --option . Этого легко добиться с помощью инструкций в документации компонента.

Итак, консольное приложение готово, оно отображает информацию с заранее подготовленных фикстур и даже покрыто тестами. Пришло время реализовать прямое получение информации о файлах и папках из облака.

Поскольку в ответ на запрос авторизации возвращается несколько редиректов, которые в конечном итоге приводят к почтовому ящику пользователя, я решил просто проверить заголовок страницы, чтобы определить, прошла ли авторизация успешно.

Проверка настолько проста, что теперь она не проходит, если в почтовом ящике есть непрочитанные сообщения — их количество отображается в шапке страницы. Но коробкой не пользуюсь, так что для моих целей этого достаточно.

Далее я попытался запросить токен csrf, но с удивлением получил знакомую ошибку:

Проще всего это сделать один раз при инициализации клиента:

Еще один параметр инициализации — 'debug' => true , с ним отладка запросов практически безболезненна.

Я добавил этот запрос после запроса авторизации и, наконец, смог получить токен. Ну а дальше дело техники - запросить содержимое корневой папки и рекурсивно содержимое ее подпапок, и дерево готово.

Как оказалось, в итоге дерево даже не понадобилось — каждый файл хранит полный путь от корня, так что для скачивания достаточно плоского списка.

Учитывая, что адреса шардов отличаются только номером, думаю, можно было бы не заморачиваться и хардкодить адрес, а если уж, то до конца!

Нас интересует массив, хранящийся в get .

Выбираем из массива шардов случайный элемент, добавляем к нему адрес файла и ссылка на скачивание готова!
Для экономии памяти можно сразу указать при создании запроса, куда Guzzle должен писать ответ; для этого используется параметр стока.

Окончательный код выложен на GitHub под лицензией MIT, буду рад, если кому-то пригодится.

Приложение далеко от идеала, его функционал ограничен, в нем точно есть баги и покрытие тестами оставляет желать лучшего, но оно на 100% решило мою проблему, а это именно то, что требуется от MVP.

*Все, что не успел удалить первым.

UPD: Связь с тех. поддержка.

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

К сожалению,
восстановить файлы, удаленные одновременно в Облаке и на ПК, невозможно.

По умолчанию
выполняется полная двусторонняя синхронизация между веб-интерфейсом и приложением на компьютере - при удалении файла из
Облака в веб-интерфейсе файл также удаляется в приложении и
наоборот: удаление файла в приложении также удаляет файл в Облаке.

Вы можете настроить выборочную синхронизацию в клиенте Cloud PC. Для этого
щелкните правой кнопкой мыши по значку Облака (в области уведомлений) и
перейдите в раздел «Выбор папок».
В открывшемся окне снимите галочки напротив тех папок, для
которых вы хотите отменить синхронизацию и нажмите «Выбрать».
Если папка была ранее синхронизирована, то она будет удалена с вашего
компьютера, но папка, а также все содержащиеся в ней
файлы, будут сохранены в веб-интерфейсе Облака .
Чтобы снова включить синхронизацию для ранее удаленной папки,
щелкните правой кнопкой мыши значок облачного приложения, нажмите «Выбрать папки» и
установите флажок рядом с названием нужной папки.

Вы также можете временно отключить синхронизацию.Для этого
щелкните правой кнопкой мыши значок облачного приложения и выберите «Приостановить
синхронизацию».

Возможно я не совсем ясно изложил свою проблему, попробую перефразировать.

Все мои файлы сейчас находятся в облаке. Я купил новый жесткий диск и хочу загрузить на него эти файлы. Но когда я создал на нем пустую папку и указал ее в приложении, вместо загрузки файлов из облака на компьютер файлы начали удаляться из облака.

Как мне запустить процесс в обратном направлении - скачать все из облака на компьютер без использования веб-интерфейса.

Если это невозможно сделать через приложение, есть ли альтернативные инструменты? WebDav, я так понимаю, еще не реализован?

В данный момент эта функция отсутствует.

Ваш комментарий передан разработчикам.

UPD3: На ноуте, где раньше никогда не стоял облачный клиент, скачал последнюю версию с официального сайта, установил, запустил. При выборе существующей папки история повторяется: файлы вместо скачивания начинают удаляться. Папку пробовал не создавать - аналогично.

Читайте также: