- Saved searches
- Use saved searches to filter your results more quickly
- pchelicam/DiskUploader
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- About
- Yandex Object Storage
- Как пользоваться S3 API
- Общий вид запроса к API
- URL для запроса
- CORS запросы
- Yandex Object Storage — реализация SignedURL для загрузки данных в bucket на NodeJS
- Оптимизация клиент/сервера при работе с бинарными файлами
- Yandex Object Storage
- AWS SDK и Yandex Object Storage
- Заключение
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Disk Uploader is a Java Tool that can work with Yandex.Disk, Dropbox, Mail.ru Cloud and Yandex Object Storage.
pchelicam/DiskUploader
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Disk Uploader – File Uploading Tool for Dropbox, Yandex.Disk, Cloud Mail.ru and Yandex Object Storage
Disk Uploader is a Java Tool. Its main purpose is upload file in file storage. Disk Uploader can work with different file storages. For now it can work with Dropbox, Yandex.Disk, Cloud Mail.ru and Yandex Object Storage.
You can use Disk Uploader to upload files in your storage. Also, Disk Uploader is suitable for uploading database archives. Furthermore, you can set some parameters to specify lower and upper bounds for files that can be stored in your catalog.
Also, you can set a DiskSettings.xml file and receive emails every time when Disk Uploader sends files to your storage successfully or catches an error at this operation.
You can run Disk Uploader from command line, for example:
java -jar DiskUploader-1.0-jar-with-dependencies.jar —td=TypeOfTheDisk —fu=path\to\file\file_name.txt —cu=/NameOfCatalogOnDisk/ —at=YourAuthenticationToken —tr=TopRest —mr=MinRest,
where TypeOfTheDisk is YA or DB or MRC or YOS, MinRest is minimum number of files that can be store in catalog, TopRest is maximum number of files that can be stored in catalog. Use only latin letters in —fu, —cu parameters. To work with Cloud Mail.ru you should specify parameters —un=YourUserName and —pw=YourPassword. To work with Yandex Object Storage you should specify parameters —kid=YourKeyID and —sac=YourSecretAccessKey.
Also, if you have spaces in your name of the file to upload, or in name of the catalog in storage, wrap it in apostrophes.
If you need to use Disk Uploader in Java project, you can add .jar file to your project and use the utility through DiskParameters class.
In addition, Disk Uploader is an utility that has these several features:
- upload file to catalog in storage;
- delete files when free space in storage is not enough;
- delete files to fit in specified parameters on catalog;
- send an email every time application works.
Disk Uploader requires JDK 1.6 or higher.
Disk Uploader is issued on under the GNU Lesser General Public License.
Guide for getting autentication token
Firstly, go to page and click on Register a new application.
Then, enter the name of new application. Tick on Web service and add two callback URIs — https://oauth.yandex.ru/verification_code. Also, tick all fields refers to Rest API.
After creating an application, go to URL https://oauth.yandex.ru/authorize?response_type=token&client_id= , where application ID you can find in application description.
After clicking Accept, you will be redirected to the page with URL like this:
where new OAuth-token — generated token.
Then, click on Create app. After that, tick on Dropbox API, Full Dropbox and name your app. Then, click on Generate access token.
About
Disk Uploader is a Java Tool that can work with Yandex.Disk, Dropbox, Mail.ru Cloud and Yandex Object Storage.
Yandex Object Storage
- In the Big Data Tools window, click and select Yandex Object Storage .
- In the Big Data Tools dialog that opens, specify the connection parameters:
- Name : the name of the connection to distinguish it between the other connections.
- Choose the way to get buckets:
- Select Custom roots and, in the Roots field, specify the name of the bucket or the path to a directory in the bucket. You can specify multiple names or paths by separating them with a comma.
- Select All buckets in the account . You can then use the bucket filter to show only buckets with particular names.
- Authentication type : the authentication method. You can use your account credentials (by default) or opt to enter the access and secret keys. You can also use a named profile that is located in the default Yandex Object Storage config location. If needed you can specify any profile from a custom credential file.
Optionally, you can set up:
- Per project : select to enable these connection settings only for the current project. Deselect it if you want this connection to be visible in other projects.
- Enable connection : deselect if you want to restrict using this connection. By default, the newly created connections are enabled.
- HTTP Proxy : select if you want to use IDE proxy settings or if you want to specify custom proxy settings.
You can also set up Extended Connection Settings :
- Operation timeout (s) : enter a timeout (in seconds) for operations performed on the remote storage, such as getting file info, listing or deleting objects. The default value is 15 seconds.
- Trust all SSL certificates : select it if you trust the SSL certificate used for this connection and do not want to verify it. This can be useful if, for development purposes, you have a host with a self-signed certificate – verifying it could result in an error.
Once you have established a connection, you can view the storage and work with data files in it.
Как пользоваться S3 API
Авторизация статическими ключами необходима для обращения напрямую к HTTP API и поддерживается инструментами, перечисленными в разделе Поддерживаемые инструменты.
Перечень поддерживаемых методов Amazon S3 HTTP API смотрите в Справочнике API.
Общий вид запроса к API
Общий вид запроса к Object Storage API:
// HTTP/2 Host: storage.yandexcloud.net Content-Length: length Date: date Authorization: authorization string (AWS Signature Version 4) Request_body
Запрос содержит HTTP-метод, имя бакета и ключ объекта.
Имя бакета можно указать как часть имени хоста. В этом случае запрос примет вид:
/> HTTP/2 Host: .storage.yandexcloud.net .
Набор заголовков зависит от конкретного запроса и описан в документации на соответствующий запрос.
Если вы используете API напрямую (без SDK и приложений), то для подписи запросов вам придется самостоятельно генерировать заголовок Authorization . О том, как это сделать, читайте в разделе Authenticating Requests (AWS Signature Version 4) документации Amazon S3.
URL для запроса
URL может иметь одну из следующих форм:
URL содержит имя бакета, ключ объекта и query-параметры. Пример возможных query-параметров см. в описании метода для получения объекта.
Если вы используете AWS SDK для .NET, обращайтесь к хосту s3.yandexcloud.net .
CORS запросы
Кросс-доменные запросы доступны для всех методов API, которые управляют объектами.
Для проверки разрешений CORS подразумевает предварительный запрос options к ресурсу. Object Storage позволяет отправлять кросс-доменные запросы к ресурсам без предварительного запроса, при этом в запросе должны быть те же заголовки, что и у предварительного запроса.
Yandex Object Storage — реализация SignedURL для загрузки данных в bucket на NodeJS
Несколько лет назад, я участвовал в разработке одного проекта, и как задачу, мне (тогда еще зеленому джуну) поставили реализовать систему загрузки медиа файлов на AWS S3. Важным условием было реализовать конкретно SignedURL.
Спустя несколько лет, я опять столкнулся с такой же задачей, но заказчик настаивал на отечественном облачном хранилище.
Ниже я немного расскажу что вообще такое подписанные ссылки, как перейти на Yandex Object Storage(YOS), и почему YOS и AWS S3 — это одно и то же!
Оптимизация клиент/сервера при работе с бинарными файлами
Что за такие подписанные ссылки?
Это URL, содержащий данные для авторизации запроса в своих параметрах.
То бишь, отправляя любой бинарный файл по определенной ссылке, он автоматически будет загружен в облако после валидации параметров из url.
В чем же преимущество?
В случае классической архитектуры, пользователь, загружает файл сперва на клиент, далее клиент отправляет запрос с файлом в body на сервер, и только после это сервер отправляет тот же файл в облако.
Получается что один файл мы загружаем из одного элемента структуры в другой 3 раза.
Конечно если файл маленький по объему — то простоя не будет, да и сервер сильно нагружаться не будет.
Но что если это длинное видео, в хорошем разрешении.
В случае же подписанных ссылок, файл загружается напрямую с клиента на облако, обходя сервер.
Соответственно получается так, что загрузка проходит всего 2 раза от пользователя на клиент, и с клиента в облако. Сокращаем время работы 1 операции в +- 1.5 раза.
Yandex Object Storage
Начал я работу над задачей собственно с регистрации на Yandex Cloud, слава, что концепция такая же что и у AWS.
- Регистрация на Yandex Cloud.
- Создание отдельного облака.
- Добавляем «Сервисный аккаунт» — проще говоря цифровой пользователь, содержащий статический и приватный ключи доступа. Для сервисного аккаунта можно указать его роли в каталоге, разделяя таким образом области доступа при работе с YOS.
Важно: Не забудьте после создания сервисного аккаунта добавить ему статический ключ доступа и сохранить их!
- Далее само хранилище (bucket)
На этом считайте что работа с сайтом закончена, дальше будет код, код и еще раз код.
AWS SDK и Yandex Object Storage
Думая над технической реализацией я прикинул, что суть подписанных url от места хранения не меняется. И ведь прав был, посмотрев в документации AWS S3 и YOS как генерируется ссылка отличий я не заметил.
Тут и было принято решение использовать уже знакомый мне SDK для NodeJS от Амазона.
import AWS from 'aws-sdk'; import < AWS_REGION, AWS_USER_KEY, AWS_USER_SECRET_KEY >from '../../config'; const accessKeyId = AWS_USER_KEY; const secretAccessKey = AWS_USER_SECRET_KEY; AWS.config.update(< region: AWS_REGION, accessKeyId, secretAccessKey >); export default AWS;
- В задаче стоит необходимость получать подписанную ссылку, по которой клиент сможет загрузить файл в облако, это и реализовал.
export const getSignedUrl = async (< type >: GetSignedUrlInput): Promise => < const action = 'putObject'; let objectKey = cuid(); let params = < Bucket: AWS_BUCKET_NAME, Key: `$.$`, ContentType: type, Expires: Number(SIGN_URL_EXPIRES), ACL: 'public-read', >; const signedURL: string = await new Promise((resolve, reject) => < client.getSignedUrl(action, params, (err, url) => < if (err) < reject(err); >else < resolve(url); >>); >); return < signedURL, objectURL: `https://$.storage.yandexcloud.net/$`, expensive: params.Expires >; >;
Теперь поясню что тут происходит:
- Создаем функцию, которую будем вызывать в последствии для получения ссылки, что в нее передавать — ваше решение, мне хватило только типа загружаемого файла. Возвращать собственно нужно как минимум подписанную ссылку
- Далее я создаю объект с параметрами, по которым будет строиться ссылка, из важных только Bucket и Key, остальные поля опциональны
- По объекту параметров генерируем ссылку с помощью функции из AWS SDK.
- PROFIT. Все готово)
Теперь что касается клиентской части.
Ссылка содержит в себе все необходимы headers для успешной аутентификации.
Стоит заметить что тип запроса при отправке на YOS должен быть PUT, информации про это в документации я не нашел, а вот у AWS S3 тип запроса POST.
Заключение
Это моя первая статья, еще утром я и не думал её писать, а вечером вышло это.
Для чего я это написал? Просто что бы помочь тем кто столкнется с такой задачей, ибо информации по использованию YOS на NodeJS мало, и той что помогла бы мне я не нашел.
Всем спасибо кто дочитал до этого момента!