1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/beyondstorage-go-storage

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

go-storage

Сайт | Документация | Комьюнити

Разработка Go Лицензия

Matrix Slack Telegram

Построение и тестирование Перекрестное построение Юнит-тестирование

Библиотека хранения для Golang, нейтральная по отношению к поставщику услуг.

Видение

Напишите один раз, используйте на любом сервисе хранения.

Цели

  • Независимость от поставщика услуг
  • Готовность к использованию в производстве
  • Высокая производительность

Примеры

package main

import (
    "log"

    "go.beyondstorage.io/v5/services"
    "go.beyondstorage.io/v5/types"
)
```	// Добавьте поддержку файловой системы
	_ "go.beyondstorage.io/services/fs/v4"
	// Добавьте поддержку S3
	_ "go.belongstorage.io/services/s3/v3"
	// Добавьте поддержку GCS
	_ "go.beyondstorage.io/services/gcs/v3"
	// Добавьте поддержку AzBlob
	_ "go.beyondstorage.io/services/azblob/v3"
	// Больше поддержки можно найти в BeyondStorage.
	_ "go.beyondstorage.io/services/xxx"
)```go
func main() {
	// Инициализируйте Storager из строки подключения.
	store, err := services.NewStoragerFromString("s3://bucket_name/path/to/workdir")
	if err != nil {
		log.Fatalf("Инициализация сервиса провалилась: %v", err)
	}
}

Запись данных из io.Reader в hello.txt

n, err := store.Write("hello.txt", r, length)

Чтение данных из hello.txt в io.Writer

n, err := store.Read("hello.txt", w)

Получение метаданных файла hello.txt с помощью метода Stat

o, err := store.Stat("hello.txt")

Использование методов объекта для получения его метаданных

length, ok := o.GetContentLength()

Метод List создаёт итератор для объектов по указанному пути.

it, err := store.List("path")

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

for {
	o, err := it.Next()
	if errors.Is(err, types.IterateDone) {
		break
	}
}

Удаление файла hello.txt

err = store.Delete("hello.txt")
}

Более примеров можно найти на странице go-storage-example.

Возможности

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

- [azblob](https://github.com/beyondstorage/go-service-азблоб/): [Хранилище объектов Azure Blob](https://docs.microsoft.com/en-us/azure/storage/blobs/)
- [bos](https://github.com/beyondstorage/go-service-bos): [Объектное хранилище Baidu](https://cloud.baidu.com/product/bos.html)
- [cos](https://github.com/beyondstorage/go-service-cos/): [Объектное хранилище Tencent Cloud](https://cloud.tencent.com/product/cos)
- [dropbox](https://github.com/beyondstorage/go-service-dropbox/): [Dropbox](https://www.dropbox.com)
- [fs](https://github.com/beyondstorage/go-service-fs/): Локальная файловая система
- [ftp](https://github.com/beyondstorage/go-service-ftp/): FTP
- [gcs](https://github.com/beyondstorage/go-service-gcs/): [Хранилище Google Cloud Storage](https://cloud.google.com/storage/)
- [gdrive](https://github.com/beyondstorage/go-service-gdrive): [Google Drive](https://www.google.com/drive/)
- [ipfs](https://github.com/beyondstorage/go-service-ipfs): [Межпланетная файловая система InterPlanetary File System](https://ipfs.io)
- [kodo](https://github.com/beyondstorage/go-service-kodo/): [Qiniu KODO](https://www.qiniu.com/products/kodo)
- [memory](https://github.com/beyondstorage/go-service-memory): Данные, хранящиеся только в оперативной памяти
- [minio](https://github.com/beyondstorage/go-service-minio): [MinIO](https://min.io)
- [obs](https://github.com/beyondstorage/go-service-obs): [Услуга объектного хранилища Huawei Object Storage](https://www.huaweicloud.com/product/obs.html)
- [oss](https://github.com/beyondstorage/go-service-oss/): [Объектное хранилище Aliyun](https://www.aliyun.com/product/oss)
- [qingstor](https://github.com/beyondstorage/go-service-qingstor/): [Объектное хранилище QingStor](https://www.qingcloud.com/products/qingstor/)
- [s3](https://github.com/beyondstorage/go-service-s3/): [Amazon S3](https://aws.amazon.com/s3/)**
**3** бета-сервиса, реализующих требуемые функции, но не прошедших [интеграционные тесты](https://github.com/beyondstorage/go-integration-test).- [hdfs](https://github.com/beyondstorage/go-service-hdfs): [Hadoop Distributed File System](https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html#Introduction)
- [tar](https://github.com/beyondstorage/go-service-tar): tar-файлы
- [uss](https://github.com/beyondstorage/go-service-uss/): [UPYUN Storage Service](https://www.upyun.com/products/file-storage)

**4** альфа-сервиса, находящиеся в процессе разработки.

- [onedrive](https://github.com/beyondstorage/go-service-onedrive): [Microsoft OneDrive](https://www.microsoft.com/en-ww/microsoft-365/onedrive/online-cloud-storage)
- [storj](https://github.com/beyondstorage/go-service-storj): [Storj](https://www.storj.io/)
- [webdav](https://github.com/beyondstorage/go-service-webdav): [WebDAV](http://www.webdav.org/)
- [zip](https://github.com/beyondstorage/go-service-zip): zip-файлы

Более идей сервисов можно найти на странице [Отслеживания Интеграций Сервисов](https://github.com/beyondstorage/go-storage/issues/536).

### Полностью завершенный и легко расширяемый интерфейс

Основные операции:

- **Метаданные**: получение метаданных `Storager`
```go
meta := store.Metadata()
_ = meta.GetWorkDir() // Получение рабочего каталога объекта
_, ok := meta.GetWriteSizeMaximum() // Получение максимального размера для записи
  • Чтение: чтение содержимого Object
// Чтение 2048 байтов с смещением 1024 в io.Writer.
n, err := store.Read("путь", w, pairs.WithOffset(1024), pairs.WithSize(2048))
  • Запись: запись содержимого в Object
// Запись 2048 байтов из io.Reader
n, err := store.Write("путь", r, 2048)
  • Статистика: получение метаданных Object или проверка существования
o, err := store.Stat("путь")
if errors.Is(err, services.ErrObjectNotExist) {
    // Объект отсутствует
}
length, ok := o.GetContentLength() // Получение длины содержимого объекта.
```- **Удаление**: удаление `Object`
```go
err := store.Delete("путь") // Удаление объекта "путь"
  • Перечисление: перечисление Object в указанном префиксах или директории
it, err := store.List("путь")
for {
	o, err := it.Next()
	if err != nil && errors.Is(err, types.IterateDone) {
		// список закончен
	}
	length, ok := o.GetContentLength() // Получение длины содержимого объекта.
}

Расширенные операции

  • Копирование: копирование объекта внутри хранилища
err := store.(Copier).Copy(src, dst) // Копирует объект из src в dst.
  • Перемещение: перемещение объекта внутри хранилища
err := store.(Mover).Move(src, dst) // Перемещает объект из src в dst.
  • Получение URL: генерация публично доступного URL для объекта
url, err := store.(Reacher).Reach("path") // Генерирует URL для объекта.
  • Создание директорий: поддержка создания директорий
o, err := store.(Direr).CreateDir("path") // Создает директорию.

Обработка больших файлов

  • Множественные части: позволяет выполнять множественные загрузки
ms := store.(Multiparter)

// Создает объект с множественными частями.
o, err := ms.CreateMultipart("path")
// Записывает bkSize байт из io.Reader в объект с множественными частями по индексу partIndex
n, part, err := ms.WriteMultipart(o, r, bkSize, partIndex)
// Завершает объект с множественными частями.
err := ms.CompleteMultipart(o, []*Part{part})
  • Добавление данных: позволяет добавлять данные к объекту
as := store.(Appender)
```// Создает добавляемый объект.
o, err := as.CreateAppend("путь")
// Записывает 1024 байта из io.Reader.
n, err := as.WriteAppend(o, r, 1024)
// Подтверждает добавленные данные.
err = as.CommitAppend(o)
  • Блокировка: позволяет объединять объект с ID блока
bs := store.(Blocker)
```// Создает блочный объект.
o, err := bs.CreateBlock("путь")
// Записывает 1024 байта из io.Reader с ID блока "id-abc"
n, err := bs.WriteBlock(o, r, 1024, "id-abc")
// Объединяет блок через ID блока.
err := bs.CombineBlock(o, []string{"id-abc"})

```markdown
- Разбиение: позволяет выполнять случайные записи
```go
ps := store.(Pager)

// Создает объект страницы.
o, err := ps.CreatePage("путь")
// Записывает 1024 байта из io.Reader с смещением 2048
n, err := ps.WritePage(o, r, 1024, 2048)

Полная метаданные

Глобальные метаданные объекта

  • id: уникальный ключ в сервисе
  • name: относительный путь к рабочей директории сервиса
  • mode: режим объекта может быть комбинацией read, dir, part и более
  • etag: entity tag как определено в rfc2616
  • content-length: размер содержимого объекта.
  • content-md5: md5 хэш как определено в rfc2616
  • content-type: тип медиа как определено в rfc2616
  • last-modified: последнее время обновления объекта. Метаданные объекта системы

Получение метаданных сервисного объекта системы, таких как storage-class и так далее.

o, err := store.Stat("путь")

// Получение сервисных метаданных объекта через API, предоставленное go-service-s3.
om := s3.GetObjectSystemMetadata(o)
_ = om.StorageClass // класс хранения этого объекта
_ = om.ServerSideEncryptionCustomerAlgorithm // алгоритм шифрования SSE этого объекта

Сильное типирование вездеСамостоятельно поддерживаемое генератором определение помогает сгенерировать все наши API, пары и метаданные.

Сгенерированные пары, которые могут использоваться как опциональные аргументы API.

func WithContentMd5(v string) Pair {
    return Pair{
        Key:   "content_md5",
        Value: v,
    }
}

Сгенерированные метаданные объекта, которые можно использовать для получения MD5 содержимого объекта.

func (o *Object) GetContentMd5() (string, bool) {
    o.stat()

    if o.bit & objectIndexContentMd5 != 0 {
        return o.contentMd5, true
    }

    return "", false
}

Шифрование стороннего сервера

Шифрование стороннего сервера поддерживается через системные пары и метаданные системы, и мы можем использовать стандартные пары для упрощения задачи.

func NewS3SseC(key []byte) (types.Storager, error) {
    defaultPairs := s3.DefaultStoragePairs{
        Write: []types.Pair{
            // Обязательно, должно быть AES256
            s3.WithServerSideEncryptionCustomerAlgorithm(s3.ServerSideEncryptionAes256),
            // Обязательно, ваш ключ AES-256, двоичное значение размером 32 байта
            s3.WithServerSideEncryptionCustomerKey(key),
        },
        // Теперь вам нужно предоставить ключ клиента для чтения зашифрованных данных
        Read: []types.Pair{
            // Обязательно, должно быть AES256
            s3.WithServerSideEncryptionCustomerAlgorithm(s3.ServerSideEncryptionAes256),
            // Обязательно, ваш ключ AES-256, двоичное значение размером 32 байта
            s3.WithServerSideEncryptionCustomerKey(key),
        },
    }

    return s3.NewStorager(..., s3.WithDefaultStoragePairs(defaultPairs))
}
```## Поддержка проекта

<a href="https://vercel.com?utm_source=beyondstorage&utm_campaign=oss">
    <img src="./docs/images/vercel.svg">
</a>

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

A vendor-neutral storage library for Golang. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/beyondstorage-go-storage.git
git@api.gitlife.ru:oschina-mirror/beyondstorage-go-storage.git
oschina-mirror
beyondstorage-go-storage
beyondstorage-go-storage
master