All Products
Search
Document Center

Object Storage Service:Tautan simbolik

Last Updated:Sep 11, 2026

Tautan simbolik merupakan cara praktis untuk mengakses objek yang sering digunakan dalam bucket. Setelah dibuat, Anda dapat menggunakan tautan simbolik seperti pintasan Windows untuk mengakses objek target.

Catatan penggunaan

  • Anda dapat langsung mengakses objek dengan kelas penyimpanan Standard atau Infrequent Access melalui tautan simboliknya.

  • Untuk mengakses objek dengan kelas penyimpanan Archive, Cold Archive, atau Deep Cold Archive melalui tautan simbolik, Anda harus terlebih dahulu memulihkan objek tersebut. Untuk informasi selengkapnya, lihat Restore objects.

  • Tautan simbolik menyimpan path objek target, bukan kontennya. Oleh karena itu, penggunaan ruang penyimpanan oleh tautan simbolik bergantung pada panjang path objek target, bukan pada ukuran objek tersebut. Sebagai contoh, tautan simbolik yang mengarah ke objek berukuran 1 MB bernama image.jpg hanya memerlukan sekitar 0,009 KB ruang penyimpanan.

  • Akses ke tautan simbolik mengikuti prinsip least privilege. Dalam skenario yang melibatkan kebijakan bucket atau kebijakan RAM, pengguna harus memiliki izin untuk mengakses baik tautan simbolik maupun objek targetnya. Akses akan ditolak jika salah satu izin tersebut tidak tersedia. Untuk skenario yang melibatkan daftar kontrol akses (ACL), jika tautan simbolik bersifat private, pengguna tidak dapat menggunakannya untuk mengakses objek target meskipun objek target tersebut bersifat public-read. Demikian pula, jika tautan simbolik bersifat public-read tetapi objek targetnya private, akses juga akan ditolak.

  • Tautan simbolik tidak mendukung enkripsi sisi server.

Prosedur

Konsol OSS

  1. Konsol OSS.

  2. klik Buckets. Pada halaman yang muncul, klik nama bucket yang diinginkan.

  3. Di bilah navigasi kiri, pilih Object Management

    Objects.

  4. Di kolom Actions untuk objek target, pilih more > Configure Symbolic Link.

  5. Di panel Configure Symbolic Link, atur Symbolic Link File or Folder, lalu klik OK.

    Nama yang Anda tentukan untuk tautan simbolik harus mengikuti konvensi penamaan yang ditampilkan di konsol. Misalkan objek saat ini berada di direktori /test/:

    • Jika Anda memilih Absolute Path dan menamai tautan simbolik tersebut t1-symlink, path tautan simboliknya adalah /t1-symlink.

    • Jika Anda memilih Relative Path dan menamai tautan simbolik tersebut t2-symlink, path tautan simboliknya adalah /test/t2-symlink.

    Penting

    Jika nama file tautan simbolik tidak menyertakan ekstensi file (misalnya, tautan simbolik untuk objek myphoto.jpg diberi nama myphoto), Anda tetap dapat melihat pratinjau tautan simbolik tersebut melalui konsol atau URL. Namun, saat Anda mengunduh tautan simbolik tersebut menggunakan tool atau konsol, file yang diunduh dianggap sebagai file dengan jenis tidak dikenal dan tidak dapat dibuka secara langsung karena tidak memiliki ekstensi file. Untuk membuka file tersebut, tambahkan ekstensi file yang sesuai.

ossbrowser

Pastikan Anda telah menginstal ossbrowser 2.0 dan masuk ke dalamnya.

  1. Klik nama bucket target dan temukan objek target.

  2. Klik ikon image di sebelah kanan objek target, lalu klik Configure Symbolic Link.

  3. Masukkan path lengkap untuk tautan simbolik, termasuk nama file, lalu klik OK. Misalnya, untuk membuat tautan simbolik bernama symlink di direktori exampledir/ untuk objek target, masukkan exampledir/symlink.

Alibaba Cloud SDKs

Kode berikut menunjukkan cara membuat tautan simbolik menggunakan Alibaba Cloud SDK untuk bahasa pemrograman populer. Untuk informasi tentang penggunaan SDK untuk bahasa lainnya, lihat SDK overview.

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {
    public static void main(String[] args) throws Exception {
        // Dalam contoh ini, titik akhir wilayah China (Hangzhou) digunakan. Tentukan titik akhir aktual Anda. 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Tentukan nama bucket. Contoh: examplebucket. 
        String bucketName = "examplebucket";
        // Tentukan nama tautan simbolik yang ingin Anda buat. 
        String symLink = "yourSymLink";
        // Tentukan nama objek yang menjadi target tautan simbolik. 
        String destinationObjectName = "yourDestinationObjectName";
        // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instance OSSClient. 
        // Panggil metode shutdown untuk melepaskan sumber daya ketika OSSClient tidak lagi digunakan.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // Buat metadata untuk objek yang ingin Anda unggah. 
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType("text/plain");
            // Atur parameter properti untuk metadata pengguna menjadi property-value. 
            metadata.addUserMetadata("property", "property-value");

            // Tentukan apakah akan menimpa objek yang memiliki nama sama dengan tautan simbolik. 
            // metadata.setHeader("x-oss-forbid-overwrite", "true");
            // Tentukan daftar kontrol akses (ACL) objek. 
            // metadata.setHeader(OSSHeaders.OSS_OBJECT_ACL, CannedAccessControlList.Default);
            // Tentukan kelas penyimpanan objek. 
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);

            // Buat CreateSymlinkRequest untuk membuat tautan simbolik. 
            CreateSymlinkRequest createSymlinkRequest = new CreateSymlinkRequest(bucketName, symLink, destinationObjectName);

            // Konfigurasikan metadata. 
            createSymlinkRequest.setMetadata(metadata);

            // Buat tautan simbolik. 
            ossClient.createSymlink(createSymlinkRequest);

        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}            
const OSS = require('ali-oss')

const client = new OSS({
  // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi oss-cn-hangzhou. 
  region: 'yourRegion',
  // Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // Tentukan nama bucket. 
  bucket: 'examplebucket',
});

const headers = {
   // Tentukan kelas penyimpanan objek. 
   'x-oss-storage-class':'Standard', 
   // Tentukan daftar kontrol akses (ACL) objek. 
   'x-oss-object-acl':'private',
   // Tentukan apakah akan menimpa objek yang memiliki nama sama dengan tautan simbolik. Dalam contoh ini, parameter ini diatur ke true, yang berarti objek dengan nama yang sama tidak dapat ditimpa. 
   'x-oss-forbid-overwrite': 'true '
};

async function put () {
  try {
    // Tentukan symlinkobject.txt sebagai nama tautan simbolik dan exampleobject.txt sebagai nama objek yang menjadi target tautan simbolik.  
    const result = await client.putSymlink('symlinkobject.txt', 'exampleobject.txt'
    // ,{ headers }
    );
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

put();
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>Document</title>
</head>

<body>
  <button id='upload'>Upload</button>
  <button id='symlink'>Create Symbolic Link</button>  
  <!-- Impor file SDK -->
  <script type="text/javascript" src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
  <script type="text/javascript">
    const client = new OSS({
       // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket Anda berada di wilayah China (Hangzhou), atur wilayah menjadi oss-cn-hangzhou. 
       region: 'yourRegion',
       authorizationV4: true,
       // Tentukan pasangan AccessKey temporary yang diperoleh dari STS. Pasangan AccessKey terdiri dari ID AccessKey dan Rahasia AccessKey. 
       accessKeyId: 'yourAccessKeyId',
       accessKeySecret: 'yourAccessKeySecret',
       // Tentukan token keamanan yang diperoleh dari STS. 
       stsToken: 'yourSecurityToken',
       // Tentukan nama bucket. Contoh: examplebucket. 
       bucket: "examplebucket",
     });

    const upload = document.getElementById('upload')
    const symlink = document.getElementById('symlink')
    const getSymlink = document.getElementById("getSymlink")

    // Tentukan konten objek yang akan diunggah. 
    const file = new Blob(['examplecontent'])
    // Tentukan nama objek yang akan diunggah ke bucket. 
    const fileName = 'exampleobject.txt'

    // Unggah objek. 
    upload.addEventListener('click', () => {
      client.put(fileName, file).then(r => console.log(r))
    })
    
    // Buat tautan simbolik bernama symlink.txt. 
    symlink.addEventListener('click', () => {
      client.putSymlink('symlink.txt', fileName).then(r => console.log(r))
    })

  </script>
</body>

</html>
using Aliyun.OSS;
using System.Text;
using Aliyun.OSS.Common;

// Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. 
var endpoint = "yourEndpoint";
// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Tentukan nama bucket. Contoh: examplebucket. 
var bucketName = "examplebucket";
var targetObjectName = "yourTargetObjectName";
var symlinkObjectName = "yourSymlinkObjectName";
var objectContent = "More than just cloud.";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou.
const string region = "cn-hangzhou";

// Buat instance ClientConfiguration dan ubah parameter default sesuai kebutuhan Anda.
var conf = new ClientConfiguration();

// Gunakan algoritma signature V4.
conf.SignatureVersion = SignatureVersion.V4;

// Buat instance OssClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    // Unggah objek yang menjadi target tautan simbolik. 
    byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
    MemoryStream requestContent = new MemoryStream(binaryData);
    client.PutObject(bucketName, targetObjectName, requestContent);
    // Buat tautan simbolik. 
    client.CreateSymlink(bucketName, symlinkObjectName, targetObjectName);
    // Kueri nama objek yang menjadi target tautan simbolik. 
    var ossSymlink = client.GetSymlink(bucketName, symlinkObjectName);
    Console.WriteLine("Target object is {0}", ossSymlink.Target);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}
// Buat permintaan. 
PutSymlinkRequest putSymlink = new PutSymlinkRequest();
// Tentukan nama bucket. 
putSymlink.setBucketName("yourBucketName");
// Tentukan nama tautan simbolik. 
putSymlink.setObjectKey("yourSymLink");
// Tentukan nama objek yang menjadi target tautan simbolik. 
putSymlink.setTargetObjectName("yourTargetObjectName");

ObjectMetadata metadata = new ObjectMetadata();
// Tentukan apakah akan menimpa objek yang memiliki nama sama. Dalam contoh ini, parameter ini diatur ke true, yang berarti objek dengan nama yang sama tidak dapat ditimpa. 
//metadata.setHeader("x-oss-forbid-overwrite", "true");
// Tentukan daftar kontrol akses (ACL) objek. Dalam contoh ini, ACL diatur ke private. 
//metadata.setHeader("x-oss-object-acl", "private");
// Tentukan kelas penyimpanan objek. Dalam contoh ini, kelas penyimpanan diatur ke Standard. 
//metadata.setHeader("x-oss-storage-class", "Standard");
putSymlink.setMetadata(metadata);

OSSAsyncTask task = oss.asyncPutSymlink(putSymlink, new OSSCompletedCallback<PutSymlinkRequest, PutSymlinkResult>() {
    @Override
    public void onSuccess(PutSymlinkRequest request, PutSymlinkResult result) {
        Log.d("PutSymlink", "PutSymlink success");
    }

    @Override
    public void onFailure(PutSymlinkRequest request, ClientException clientException,
                          ServiceException serviceException) {
        // Tangani eksepsi permintaan. 
        if (clientException != null) {
            // Tangani eksepsi client, seperti eksepsi jaringan. 
            clientException.printStackTrace();
        }
        if (serviceException != null) {
            // Tangani eksepsi sisi server. 
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage", serviceException.getRawMessage());
        }
    }
});
task.waitUntilFinished();
OSSPutSymlinkRequest *request = [OSSPutSymlinkRequest new];
// Tentukan nama bucket. Contoh: examplebucket. 
request.bucketName = @"examplebucket";
// Tentukan nama tautan simbolik. 
request.objectKey = @"examplesymlink";
// Tentukan path lengkap objek yang menjadi target tautan simbolik. Jangan sertakan nama bucket dalam path lengkap tersebut. 
request.targetObjectName = @"exampleobject.txt";

OSSTask *putSymlinkTask = [client putSymlink:request];
[putSymlinkTask continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    if (!task.error) {
        NSLog(@"put symlink success");
    } else {
        NSLog(@"put symlink failed, error: %@", task.error);
    }
    return nil;
}];
// Implementasikan pemblokiran sinkron untuk menunggu tugas selesai. 
// [putSymlinkTask waitUntilFinished];
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
            
    /* Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou. */
    std::string Region = "yourRegion";
    /* Tentukan nama bucket. Contoh: examplebucket. */
    std::string BucketName = "examplebucket";
    /* Tentukan path lengkap objek. Contoh: exampledir/exampleobject.txt. Jangan sertakan nama bucket dalam path lengkap tersebut. */
    std::string ObjectName = "exampledir/exampleobject.txt";
    /* Tentukan path lengkap tautan simbolik. Contoh: shortcut/myobject.txt. */
    std::string LinkName = "shortcut/myobject.txt";

    /* Inisialisasi sumber daya, seperti sumber daya jaringan. */
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);



    /* Konfigurasikan header HTTP. */
    auto meta = ObjectMetaData();
    meta.setContentType("text/plain");

    /* Konfigurasikan metadata pengguna objek. */
    meta.UserMetaData()["meta"] = "meta-value";

    /* Buat tautan simbolik. */
    CreateSymlinkRequest request(BucketName, ObjectName, meta);
    request.SetSymlinkTarget(LinkName);
    auto outcome = client.CreateSymlink(request);

    if (!outcome.isSuccess()) {
        /* Tangani eksepsi. */
        std::cout << "CreateSymlink fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* Lepaskan sumber daya, seperti sumber daya jaringan. */
    ShutdownSdk();
    return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket. Contoh: examplebucket. */
const char *bucket_name = "examplebucket";
/* Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap tersebut. Contoh: exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
/* Tentukan path lengkap tautan simbolik yang ingin Anda buat. */
const char *link_object_name = "yourLinkObjectName";
/* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou. */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* Gunakan string char* untuk menginisialisasi data bertipe aos_string_t. */
    aos_str_set(&options->config->endpoint, endpoint);
    /* Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
    aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
    aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
    // Tentukan dua parameter tambahan.
    aos_str_set(&options->config->region, region);
    options->config->signature_version = 4;
    /* Tentukan apakah akan menggunakan CNAME. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
    options->config->is_cname = 0;
    /* Tentukan parameter jaringan, seperti periode timeout. */
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* Panggil metode aos_http_io_initialize di main() untuk menginisialisasi sumber daya global, seperti sumber daya jaringan dan memori. */
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* Buat pool memori untuk mengelola memori. aos_pool_t setara dengan apr_pool_t. Kode untuk membuat pool memori termasuk dalam library APR. */
    aos_pool_t *pool;
    /* Buat pool memori. Nilai parameter kedua adalah NULL. Nilai ini menunjukkan bahwa pool tidak mewarisi pool memori lainnya. */
    aos_pool_create(&pool, NULL);
    /* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
    oss_request_options_t *oss_client_options;
    /* Alokasikan sumber daya memori dalam pool memori ke opsi. */
    oss_client_options = oss_request_options_create(pool);
    /* Inisialisasi oss_client_options. */
    init_options(oss_client_options);
    /* Inisialisasi parameter. */
    aos_string_t bucket;
    aos_string_t object;
    aos_string_t sym_object;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL; 
    aos_str_set(&bucket, bucket_name);
    aos_str_set(&object, object_name);
    aos_str_set(&sym_object, link_object_name);
    resp_status = oss_put_symlink(oss_client_options, &bucket, &sym_object, &object, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        printf("put symlink succeeded\n");
    } else {
        printf("put symlink failed\n");      
    }
    /* Lepaskan pool memori. Operasi ini melepaskan sumber daya memori yang dialokasikan untuk permintaan. */
    aos_pool_destroy(pool);
    /* Lepaskan sumber daya global yang dialokasikan. */
    aos_http_io_deinitialize();
    return 0;
}

ossutil

Anda dapat menggunakan ossutil untuk membuat tautan simbolik. Untuk informasi lebih lanjut tentang cara menginstal ossutil, lihat Install ossutil.

Perintah berikut membuat tautan simbolik bernama examplelink yang mengarah ke objek target targetobject.

ossutil api put-symlink --bucket examplebucket --key examplelink --symlink-target targetobject

Untuk informasi lebih lanjut tentang perintah ini, lihat put-symlink.

Referensi API

Untuk kustomisasi lanjutan, Anda dapat membuat permintaan REST API secara langsung. Hal ini mengharuskan Anda menghitung signature secara manual dalam kode Anda. Untuk informasi selengkapnya, lihat PutSymlink.

FAQ

Dapatkah saya membuat tautan simbolik untuk objek private?

Pembuatan tautan simbolik tidak bergantung pada izin baca-tulis objek target. Anda dapat membuat tautan simbolik untuk objek dengan pengaturan daftar kontrol akses (ACL) apa pun, termasuk bucket-owner-full-control, private, public-read, dan public-read-write.

Bagaimana cara menentukan apakah suatu objek adalah tautan simbolik?

Anda dapat memanggil operasi HeadObject atau GetObject dan memeriksa tanggapannya.

Jika objek tersebut adalah tautan simbolik, tanggapan akan berisi konten objek target. Header Content-Length, ETag, dan Content-Md5 dalam tanggapan merupakan metadata objek target.

Jika saya menghapus tautan simbolik, apakah objek targetnya juga dihapus?

Tidak. Menghapus tautan simbolik hanya menghapus tautannya saja dan tidak memengaruhi objek target.