# `LibOss.Core.Multipart`
[🔗](https://github.com/tt67wq/lib-oss/blob/main/lib/lib_oss/core/multipart.ex#L1)

分片上传模块

负责：
- 初始化：init_multi_upload
- 上传分片：upload_part
- 列表操作：list_multipart_uploads, list_parts
- 完成/中止：complete_multipart_upload, abort_multipart_upload

# `err_t`

```elixir
@type err_t() :: {:error, LibOss.Exception.t()}
```

# `abort_multipart_upload`

```elixir
@spec abort_multipart_upload(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object(),
  LibOss.Typespecs.upload_id()
) :: :ok | err_t()
```

中止分片上传

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称
- upload_id: 上传ID

## 返回值
- :ok | {:error, Exception.t()}

## 示例
    iex> LibOss.Core.Multipart.abort_multipart_upload(MyOss, "my-bucket", "large-file.zip", "upload-id-123456")
    :ok

## 相关文档
https://help.aliyun.com/document_detail/31996.html

# `calculate_part_count`

```elixir
@spec calculate_part_count(non_neg_integer(), non_neg_integer()) :: non_neg_integer()
```

计算文件分片数量

## 参数
- file_size: 文件大小（字节）
- part_size: 分片大小（字节，可选，默认5MB）

## 返回值
- non_neg_integer()

## 示例
    iex> LibOss.Core.Multipart.calculate_part_count(100 * 1024 * 1024)
    20

# `complete_multipart_upload`

```elixir
@spec complete_multipart_upload(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object(),
  LibOss.Typespecs.upload_id(),
  [{LibOss.Typespecs.part_num(), LibOss.Typespecs.etag()}],
  LibOss.Typespecs.headers()
) :: :ok | err_t()
```

完成分片上传

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称
- upload_id: 上传ID
- parts: 分片列表，格式为 [{part_number, etag}, ...]
- headers: 可选的HTTP请求头

## 返回值
- :ok | {:error, Exception.t()}

## 示例
    iex> parts = [{1, ""etag1""}, {2, ""etag2""}]
    iex> LibOss.Core.Multipart.complete_multipart_upload(MyOss, "my-bucket", "large-file.zip", "upload-id-123456", parts)
    :ok

## 相关文档
https://help.aliyun.com/document_detail/31995.html

# `init_multi_upload`

```elixir
@spec init_multi_upload(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object(),
  LibOss.Typespecs.headers()
) :: {:ok, LibOss.Typespecs.upload_id()} | err_t()
```

初始化分片上传

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称
- req_headers: 可选的HTTP请求头

## 返回值
- `{:ok, upload_id} | {:error, Exception.t()}`

## 示例
    iex> LibOss.Core.Multipart.init_multi_upload(MyOss, "my-bucket", "large-file.zip")
    {:ok, "upload-id-123456"}

## 相关文档
https://help.aliyun.com/document_detail/31992.html

# `list_multipart_uploads`

```elixir
@spec list_multipart_uploads(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.params()
) :: {:ok, map()} | err_t()
```

列出分片上传任务

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- query_params: 查询参数

## 查询参数
- key-marker: 起始对象名
- upload-id-marker: 起始上传ID
- max-uploads: 最大返回数量

## 返回值
- `{:ok, map()} | {:error, Exception.t()}`

## 示例
    iex> LibOss.Core.Multipart.list_multipart_uploads(MyOss, "my-bucket", %{"max-uploads" => "100"})
    {:ok, %{uploads: [...], is_truncated: false}}

## 相关文档
https://help.aliyun.com/document_detail/31997.html

# `list_parts`

```elixir
@spec list_parts(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object(),
  LibOss.Typespecs.upload_id(),
  LibOss.Typespecs.params()
) :: {:ok, map()} | err_t()
```

列出已上传的分片

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称
- upload_id: 上传ID
- query_params: 查询参数（可选）

## 查询参数
- part-number-marker: 起始分片号
- max-parts: 最大返回数量

## 返回值
- `{:ok, map()} | {:error, Exception.t()}`

## 示例
    iex> LibOss.Core.Multipart.list_parts(MyOss, "my-bucket", "large-file.zip", "upload-id-123456")
    {:ok, %{parts: [...], is_truncated: false}}

## 相关文档
https://help.aliyun.com/document_detail/31998.html

# `multipart_limits`

```elixir
@spec multipart_limits() :: map()
```

获取分片上传限制信息

## 返回值
- map()

## 示例
    iex> LibOss.Core.Multipart.multipart_limits()
    %{
      min_part_size: 5242880,
      max_part_size: 5368709120,
      max_parts: 10000
    }

# `recommended_part_size`

```elixir
@spec recommended_part_size(non_neg_integer()) :: non_neg_integer()
```

获取推荐的分片大小

## 参数
- file_size: 文件大小（字节）

## 返回值
- non_neg_integer()

根据文件大小自动计算合适的分片大小，确保分片数量不超过10000个

## 示例
    iex> LibOss.Core.Multipart.recommended_part_size(1024 * 1024 * 1024)
    5242880

# `upload_part`

```elixir
@spec upload_part(
  module(),
  LibOss.Typespecs.bucket(),
  LibOss.Typespecs.object(),
  LibOss.Typespecs.upload_id(),
  LibOss.Typespecs.part_num(),
  binary()
) :: {:ok, binary()} | err_t()
```

上传分片

## 参数
- name: Agent进程名称
- bucket: 存储桶名称
- object: 对象名称
- upload_id: 上传ID
- part_number: 分片号（1-10000）
- data: 分片数据

## 返回值
- `{:ok, etag} | {:error, Exception.t()}`

## 分片限制
- 分片号范围：1-10000
- 分片大小：5MB-5GB（最后一个分片可以小于5MB）

## 示例
    iex> LibOss.Core.Multipart.upload_part(MyOss, "my-bucket", "large-file.zip", "upload-id-123456", 1, data)
    {:ok, ""etag-value""}

## 相关文档
https://help.aliyun.com/document_detail/31993.html

# `validate_multipart_params`

```elixir
@spec validate_multipart_params(non_neg_integer(), non_neg_integer()) :: :ok | err_t()
```

验证分片上传参数

## 参数
- file_size: 文件大小
- part_size: 分片大小

## 返回值
- :ok | {:error, Exception.t()}

---

*Consult [api-reference.md](api-reference.md) for complete listing*
