OSS Go SDK提供了丰富的文件上传接口,用户可以通过以下方式向OSS中上传文件:
提示:
- 简单上传的示例代码在sample/put_object.go。
import "strings"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
err = bucket.PutObject("my-object", strings.NewReader("MyObjectValue"))
if err != nil {
// HandleError(err)
}
import "bytes"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
err = bucket.PutObject("my-object", bytes.NewReader([]byte("MyObjectValue")))
if err != nil {
// HandleError(err)
}
import "os"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
fd, err := os.Open("LocalFile")
if err != nil {
// HandleError(err)
}
defer fd.Close()
err = bucket.PutObject("my-object", fd)
if err != nil {
// HandleError(err)
}
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
err = bucket.PutObjectFromFile("my-object", "LocalFile")
if err != nil {
// HandleError(err)
}
注意:
- 使用上述方法上传最大文件不能超过5G。如果超过请使用分片上传。
参数 | 说明 |
CacheControl | 指定该Object被下载时的网页的缓存行为。 |
ContentDisposition | 指定该Object被下载时的名称。 |
ContentEncoding | 指定该Object被下载时的内容编码格式。 |
Expires | 指定过期时间。用户自定义格式,建议使用http.TimeFormat格式。 |
ServerSideEncryption | 指定oss创建object时的服务器端加密编码算法。合法值:AES256。 |
ObjectACL | 指定oss创建object时的访问权限。 |
Meta | 自定义参数,以"X-Oss-Meta-"为前缀的参数。 |
import (
"strings"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
options := []oss.Option{
oss.Expires(expires),
oss.ObjectACL(oss.ACLPublicRead),
oss.Meta("MyProp", "MyPropVal"),
}
err = bucket.PutObject("my-object", strings.NewReader("MyObjectValue"), options...)
if err != nil {
// HandleError(err)
}
提示:
- Bucket.PutObject、Bucket.PutObjectFromFile、Bucket.UploadFile、Bucket.UploadFile都支持上传时指定元数据。
import "strings"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
err = bucket.PutObject("my-dir/", strings.NewReader(""))
if err != nil {
// HandleError(err)
}
提示:
- 创建模拟文件夹本质上来说是创建了一个空文件。
- 对于这个文件照样可以上传下载,只是控制台会对以"/"结尾的文件以文件夹的方式展示。
- 所以用户可以使用上述方式来实现创建模拟文件夹。
- 而对文件夹的访问可以参看文件夹功能模拟
提示:
- 追加上传的示例代码在sample/append_object.go。
import "strings"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
var nextPos int64 = 0
// 第一次追加的位置是0,返回值为下一次追加的位置
nextPos, err = bucket.AppendObject("my-object", strings.NewReader("YourObjectValue"), nextPos)
if err != nil {
// HandleError(err)
}
// 第二次追加
nextPos, err = bucket.AppendObject("my-object", strings.NewReader("YourObjectValue"), nextPos)
if err != nil {
// HandleError(err)
}
// 您还可以进行多次Append
注意:
- 只能向可追加的文件(即通过AppendObject创建的文件)追加内容
- 可追加的文件不能被拷贝
// 第一次追加指定元信息
nextPos, err = bucket.AppendObject("my-object", strings.NewReader("YourObjectValue"), 0, oss.Meta("MyProp", "MyPropVal"))
if err != nil {
// HandleError(err)
}
提示:
- 分片上传的示例代码在sample/put_object.go。
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
// 分片大小100K,3个协程并发上传分片,使用断点续传
err = bucket.UploadFile("my-object", "LocalFile", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
if err != nil {
// HandleError(err)
}
注意:
- SDK会将上传的中间状态信息记录在cp文件中,所以要确保用户对cp文件有写权限
- cpt文件记录了上传的中间状态信息并自带了校验,用户不能去编辑它,如 果cpt文件损坏则重新上传所有分片。整个上传完成后cpt文件会被删除。
- 如果上传过程中本地文件发生了改变,则重新上传所有分片
提示:
- 指定断点续传checkpoint文件路径使用oss.Checkpoint(true, "your-cp-file.cp")
- 使用bucket.UploadFile(objectKey, localFile, 100*1024),默认不使用分片并发上传、不启动断点续传
import "fmt"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
imur, err := bucket.InitiateMultipartUpload("my-object")
if err != nil {
// HandleError(err)
}
lsRes, err := bucket.ListUploadedParts(imur)
if err != nil {
// HandleError(err)
}
fmt.Println("Parts:", lsRes.UploadedParts)
参数 | 说明 |
Delimiter | 用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素。 |
MaxUploads | 限定此次返回Multipart Uploads事件的最大数目,默认为1000,max-uploads取值不能大于1000。 |
KeyMarker | 所有Object名字的字典序大于KeyMarker参数值的Multipart事件。 |
Prefix | 限定返回的文件名(object)必须以Prefix作为前缀。注意使用Prefix查询时,返回的文件名(Object)中仍会包含Prefix。 |
import "fmt"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
lsRes, err := bucket.ListMultipartUploads()
if err != nil {
// HandleError(err)
}
fmt.Println("Uploads:", lsRes.Uploads)
lsRes, err := bucket.ListMultipartUploads(oss.Prefix("my-object-"))
if err != nil {
// HandleError(err)
}
fmt.Println("Uploads:", lsRes.Uploads)
lsRes, err := bucket.ListMultipartUploads(oss.MaxUploads(100))
if err != nil {
// HandleError(err)
}
fmt.Println("Uploads:", lsRes.Uploads)
lsRes, err := bucket.ListMultipartUploads(oss.Prefix("my-object-"), oss.MaxUploads(100))
if err != nil {
// HandleError(err)
}
fmt.Println("Uploads:", lsRes.Uploads)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。