最近在项目中需要实现客户端上传文件的功能,因为考虑到用户量可能足够大,服务器的空间非常有限,所以不能再用普通的将这些资源放在服务器里的方式了。于是我上网检索更好的方式,发现可以把文件上传到OSS上,OSS上的资源包价格都还可以。于是我学习了阿里云的OSS的一些配置。并完成了上传文件到OSS的功能。本人使用的是阿里云的OSS服务
一、基础配置
首先可以新建一个Bucket,用来存放将上传的资源。
新建成功后,可以进到Bucket概览页面查看,里面有一些关键的参数,EndPoint等
接下来实现代码上传文件功能
func UploadHandler(c *gin.Context) {
_, header, err := c.Request.FormFile("file")
f, err := header.Open()
if err != nil {
zap.L().Error("接收文件失败", zap.Error(err))
ResponseErrorWithMsg(c, CodeError, "接收文件失败")
}
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
endpoint := "自己Bucket对应的EndPoint"
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
accessKeyId := "阿里云账号的AccessKey"
accessKeySecret := "阿里云账号的AccessKeySecret"
// yourBucketName填写存储空间名称。
bucketName := "bucket名称"
// uploadFileName填写文件上传的位置及名字。
uploadFileName := "文件上传的位置及名字"
// 创建OSSClient实例。
client, err := oss.New(endpoint, accessKeyId, accessKeySecret)
if err != nil {
handleError(err)
}
// 获取存储空间。
bucket, err := client.Bucket(bucketName)
if err != nil {
handleError(err)
}
// 上传文件。
err = bucket.PutObject(uploadFileName, f)
if err != nil {
handleError(err)
}
ResponseSuccess(c, uploadPath)
}
func handleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
需要前端传递的参数为
因为该代码采用的是流式传输,所以不需要将要上传的文件先拷贝到项目目录下,再上传到OSS对象存储中。流式传输实现了直接从客户端点击上传后直接到OSS对象存储中,然后返回一个请求的地址,这个地址就是该文件的预览/下载地址。