Библиотека хранения для 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.
- [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, 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)
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.
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 )