This topic describes how to manage symbolic links in a versioning-enabled bucket.
Usage notes
In this topic, the public endpoint of the China (Hangzhou) region is used. If you want to access OSS by using other Alibaba Cloud services in the same region as OSS, use an internal endpoint. For more information about the regions and endpoints supported by OSS, see Regions and endpoints.
In this topic, access credentials are obtained from environment variables. For more information about how to configure access credentials, see Configure access credentials.
In this topic, an OSSClient instance is created by using an OSS endpoint. If you want to create an OSSClient instance by using custom domain names or Security Token Service (STS), see Initialization.
To create a symbolic link, you must have the
oss:PutObject
permission. To query a symbolic link, you must have theoss:GetObject
permission. For more information, see Attach a custom policy to a RAM user.
Create a symbolic link
You can create a symbolic link that points to the current version of an object.
In a versioning-enabled bucket, a symbolic link cannot be created for a delete marker.
A symbolic link can have multiple versions and each link version can point to different objects. When you create a symbolic link in a versioning-enabled bucket, the version ID of the link is automatically generated by OSS and is returned as the x-oss-version-id header in the response.
The following sample code provides an example on how to create a symbolic link:
package main
import (
"fmt"
"os"
"net/http"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Replace yourBucketName with the name of your bucket.
bucketName := "yourBucketName"
// Replace yourSymlinkName with the name of the symbolic link that you want to create.
objectName := "yourSymlinkName"
// Replace yourObjectName with the name of the object for which you want to create a symbolic link.
targetObjectName := "yourObjectName"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Upload the object to which the symbolic link points.
err = bucket.PutObject(targetObjectName, strings.NewReader("target"))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create the symbolic link and query the version information.
var retHeader http.Header
err = bucket.PutSymlink(objectName, targetObjectName, oss.GetResponseHeader(&retHeader))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Display the value of the x-oss-version-id header.
fmt.Println("x-oss-version-id:", oss.GetVersionId(retHeader))
}
Query a symbolic link
By default, the GetSymlink operation queries the current version of a symbolic link. You can specify the version ID in the request to query the specified version of a symbolic link. If the current version of the symbolic link is a delete marker, OSS returns 404 Not Found and includes x-oss-delete-marker = true and x-oss-version-id in the response.
To query a symbolic link, you must have read permissions on the symbolic link.
The following sample code provides an example on how to query a symbolic link:
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Replace yourBucketName with the name of your bucket.
bucketName := "yourBucketName"
// Replace yourSymlinkName with the name of the symbolic link that you want to create.
objectName := "yourSymlinkName"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Query the content of the object to which the specified version of the symbolic link points.
meta, err := bucket.GetSymlink(objectName,oss.VersionId("youObjectVersionId"))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Display the symbolic link.
fmt.Println(meta.Get(oss.HTTPHeaderOssSymlinkTarget))
}
References
For more information about the API operation that you can call to create a symbolic link, see PutSymlink.
For more information about the API operation that you can call to query a symbolic link, see GetSymlink.