全部產品
Search
文件中心

Object Storage Service:上傳檔案、圖片、視頻等資源到OSS

更新時間:Jul 25, 2024

當您需要將本地不超過5 GB大小的檔案、圖片、視頻等資源上傳到OSS,且對並發上傳效能要求不高的情況下,您可以選擇簡單上傳的方式。

前提條件

已建立儲存空間(Bucket)。更多資訊,請參見建立儲存空間

使用限制

簡單上傳的檔案大小不能超過5 GB。超過5 GB的檔案上傳請使用分區上傳

注意事項

資料安全

防止覆蓋同名Object

簡單上傳預設會覆蓋同名Object,您可以選擇以下任意方式防止Object被意外覆蓋。

  • 開啟版本控制功能

    開啟版本控制功能後,被覆蓋的Object會以歷史版本的形式儲存下來。您可以隨時恢複歷史版本Object。更多資訊,請參見版本控制介紹

  • 在上傳請求中攜帶禁止覆蓋同名Object的參數

    在上傳請求的Header中攜帶參數x-oss-forbid-overwrite,並指定其值為true。當您上傳的Object在OSS中存在同名Object時,該Object會上傳失敗,並返回FileAlreadyExists錯誤。當不攜帶此參數或此參數的值為false時,同名Object會被覆蓋。

授權上傳

  • 為了防止第三方使用者未經授權在您的Bucket中上傳資料,OSS提供了Bucket和Object層級的存取權限控制。更多資訊,請參見存取控制

  • 使用簽名URL授權第三方使用者上傳指定檔案。簽名URL允許第三方使用者在沒有安全憑證或者授權的情況下進行上傳操作。第三方使用者使用簽名URL上傳檔案後,OSS將在指定的Bucket產生該檔案。使用檔案URL上傳檔案

降低PUT類請求費用

如果要上傳的檔案數量較多,直接指定上傳的檔案類型為深度冷歸檔類型會造成較高的PUT類請求費用。建議您先將檔案的儲存類型指定為標準儲存進行上傳,然後通過生命週期規則將其轉儲為深度冷歸檔類型,從而降低PUT類請求費用。

避免影響OSS-HDFS服務

為避免影響OSS-HDFS服務的正常使用或者引發資料丟失的風險,在開通了OSS-HDFS服務的Bucket中,禁止以非OSS-HDFS服務提供的方式在OSS-HDFS的資料存放區目錄.dlsdata/中上傳Object。

上傳效能調優

如果您在上傳大量Object時,在命名上使用了順序首碼(如時間戳記或字母順序),可能會出現大量Object索引集中儲存於儲存空間中某個特定分區的情況,進而導致請求速率下降。建議您在上傳大量Object時,不要使用順序首碼的Object名稱,而是將順序首碼改為隨機性首碼。具體操作,請參見OSS效能最佳實務

操作步驟

使用OSS控制台

說明

金融雲下的OSS沒有公網地區,無法通過控制台上傳檔案,請通過SDK、ossutil、ossbrowser等方式上傳。

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇文件管理 > 檔案清單

  4. 檔案清單頁面,單擊上傳文件

  5. 上傳文件面板,按如下說明配置各項參數。

    1. 設定基礎選項。

      參數

      說明

      上傳到

      設定檔案上傳到目標Bucket後的儲存路徑。

      • 當前目錄:將檔案上傳到目前的目錄。

      • 指定目錄:將檔案上傳到指定目錄,您需要輸入目錄名稱。若輸入的目錄不存在,OSS將自動建立對應的檔案目錄並將檔案上傳到該目錄中。

        目錄命名規範如下:

        • 請使用符合要求的UTF-8字元;長度必須在1~254字元之間。

        • 不允許以正斜線(/)或反斜線(\)開頭。

        • 不允許出現連續的正斜線(/)。

        • 不允許出現名為 .. 的目錄。

      檔案ACL

      設定檔案讀寫權限ACL。

      • 繼承Bucket:以Bucket讀寫權限為準。

      • 私有(推薦):只有檔案Owner擁有該檔案的讀寫權限,其他使用者沒有許可權操作該檔案。

      • 公共讀:檔案Owner擁有該檔案的讀寫權限,其他使用者(包括匿名訪問者)都可以對檔案進行訪問,這有可能造成您資料的外泄以及費用激增,請謹慎操作。

      • 公共讀寫:任何使用者(包括匿名訪問者)都可以對檔案進行訪問,並且向該檔案寫入資料。這有可能造成您資料的外泄以及費用激增,若被人惡意寫入違法資訊還可能會侵害您的合法權益。除特殊情境外,不建議您配置公用讀寫許可權。

      有關檔案ACL的更多資訊,請參見設定Object ACL

      待上傳檔案

      選擇您需要上傳的檔案或檔案夾。

      您可以單擊掃描檔案掃描文件夾選擇本地檔案或檔案夾,或者直接拖拽目標檔案或檔案夾到待上傳檔案地區。

      如果上傳檔案夾中包含了無需上傳的檔案,請單擊目標檔案右側的移除將其移出檔案清單。

      重要
      • 在未開啟版本控制Bucket中上傳檔案時,如果上傳的檔案與已有檔案同名,則覆蓋已有檔案。

      • 在已開啟版本控制Bucket中上傳檔案時,如果上傳的檔案與已有檔案同名,則上傳檔案將成為最新版本,已有檔案將成為歷史版本。

    2. 可選:設定檔案儲存體類型、加密方式等進階選項。

      參數

      說明

      存儲類型

      設定檔案儲存體類型。

      • 繼承Bucket:以Bucket儲存類型為準。

      • 標準儲存提供高可靠、高可用、高效能的Object Storage Service服務,能夠支援頻繁的資料訪問。適用於各種社交、分享類的圖片、音視頻應用、大型網站、巨量資料分析等業務情境。

      • 低頻訪問儲存提供高持久性、較低儲存成本的Object Storage Service服務。有最小計量單位(64 KB)和最低儲存時間(30天)的要求。支援資料即時訪問,訪問資料時會產生資料取回費用。適用於較低訪問頻率(平均每月訪問頻率1到2次)的業務情境。

      • Archive Storage提供高持久性、極低儲存成本的Object Storage Service服務。有最小計量單位(64 KB)和最低儲存時間(60天)的要求。資料需解凍(約1分鐘)後訪問,會產生資料解凍費用。如果開啟歸檔直讀,無需解凍就可以訪問資料,會產生資料直讀取回費用。適用於資料長期儲存的業務情境,例如檔案資料、醫學影像、科學資料、影視素材等。

      • 冷Archive Storage提供高持久性、比Archive Storage的儲存成本更低的Object Storage Service服務。有最小計量單位(64 KB)和最低儲存時間(180天)的要求。資料需解凍後訪問,解凍時間根據資料大小和選擇的解凍模式決定,解凍會產生資料取回費用以及取回請求費用。適用於需要超長時間存放的冷資料,例如因合規要求需要長期留存的資料、巨量資料及人工智慧領域長期積累的未經處理資料、影視行業長期留存的媒體資源、線上教育行業的歸檔視頻等業務情境。

      • 深度冷Archive Storage提供高持久性、比冷Archive Storage成本更低的Object Storage Service服務。有最小計量單位(64 KB)和最低儲存時間(180天)的要求。資料需解凍後訪問,解凍時間根據資料大小和選擇的解凍模式決定,解凍會產生資料取回費用以及取回請求費用。適用於需要超長時間存放的極冷資料,例如巨量資料及人工智慧領域的未經處理資料的長期積累留存、媒體資料的長期保留、法規和合規性存檔、磁帶替換等業務情境。

      更多資訊,請參見儲存類型介紹

      服務端加密方式

      設定檔案的服務端加密方式。

      • 繼承Bucket:以Bucket的伺服器端加密方式為準。

      • OSS完全託管:使用OSS託管的密鑰進行加密。OSS會為每個Object使用不同的密鑰進行加密,作為額外的保護,OSS會使用主要金鑰對加密金鑰本身進行加密。

      • KMS:使用KMS預設託管的CMK或指定CMK ID進行加解密操作。KMS對應的加密金鑰說明如下:

        • alias/acs/oss(CMK ID):使用預設託管的CMK產生不同的密鑰來加密不同的Object,並且在Object被下載時自動解密。

        • alias/<cmkname>(CMK ID):使用指定的CMK產生不同的密鑰來加密不同的Object,並將加密Object的CMK ID記錄到Object的中繼資料中,具有解密許可權的使用者下載Object時會自動解密。其中<cmkname>為建立密鑰時配置的主要金鑰可選標識。

          使用指定的CMK ID前,您需要在KMS管理主控台建立一個與Bucket處於相同地區的普通密鑰或外部金鑰。具體操作,請參見建立密鑰

      • 密碼編譯演算法僅支援AES256。

      用戶自訂中繼資料

      用於為Object添加描述資訊。您可以添加多條自訂中繼資料(User Meta),但所有的自訂中繼資料總大小不能超過8 KB。添加自訂中繼資料時,要求參數以x-oss-meta-為首碼,並為參數賦值,例如x-oss-meta-location:hangzhou

    3. 單擊上傳文件

      此時,您可以在上傳列表頁簽查看各個檔案的上傳進度。

使用圖形化管理工具ossbrowser

ossbrowser支援Bucket層級的操作與控制台支援的操作類似,請按照ossbrowser介面指引完成簡單上傳的操作。關於如何使用ossbrowser,請參見快速使用ossbrowser

使用阿里雲SDK

以下僅列舉常見SDK的簡單上傳的程式碼範例。關於其他SDK的簡單上傳的程式碼範例,請參見SDK簡介

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫Bucket名稱,例如examplebucket。
        String bucketName = "examplebucket";
        // 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // 填寫本地檔案的完整路徑,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
        String filePath= "D:\\localpath\\examplefile.txt";

        // 建立OSSClient執行個體。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 建立PutObjectRequest對象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
            // 如果需要上傳時設定儲存類型和存取權限,請參考以下範例程式碼。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);
            
            // 上傳檔案。
            PutObjectResult result = ossClient.putObject(putObjectRequest);           
        } 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();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;

// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫Bucket名稱,例如examplebucket。
$bucket= "examplebucket";
// 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
$object = "exampledir/exampleobject.txt";
// 填寫本地檔案的完整路徑,例如D:\\localpath\\examplefile.txt。如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
$filePath = "D:\\localpath\\examplefile.txt";

try{
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

    $ossClient->uploadFile($bucket, $object, $filePath);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . "OK" . "\n");
const OSS = require('ali-oss')
const path=require("path")

const client = new OSS({
  // yourregion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
  region: 'yourregion',
  // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填寫Bucket名稱。
  bucket: 'examplebucket',
});

// 自訂要求標頭
const headers = {
  // 指定Object的儲存類型。
  'x-oss-storage-class': 'Standard',
  // 指定Object的存取權限。
  'x-oss-object-acl': 'private',
  // 通過檔案URL訪問檔案時,指定以附件形式下載檔案,下載後的檔案名稱定義為example.txt。
  'Content-Disposition': 'attachment; filename="example.txt"',
  // 設定Object的標籤,可同時設定多個標籤。
  'x-oss-tagging': 'Tag1=1&Tag2=2',
  // 指定PutObject操作時是否覆蓋同名目標Object。此處設定為true,表示禁止覆蓋同名Object。
  'x-oss-forbid-overwrite': 'true',
};

async function put () {
  try {
    // 填寫OSS檔案完整路徑和本地檔案的完整路徑。OSS檔案完整路徑中不能包含Bucket名稱。
    // 如果本地檔案的完整路徑中未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
    const result = await client.put('exampleobject.txt', path.normalize('D:\\localpath\\examplefile.txt')
    // 自訂headers
    ,{headers}
    );
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

put();
# -*- coding: utf-8 -*-
import oss2
import os
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫Bucket名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 必須以二進位的方式開啟檔案。
# 填寫本地檔案的完整路徑。如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
with open('D:\\localpath\\examplefile.txt', 'rb') as fileobj:
    # Seek方法用於指定從第1000個位元組位置開始讀寫。上傳時會從您指定的第1000個位元組位置開始上傳,直到檔案結束。
    fileobj.seek(1000, os.SEEK_SET)
    # Tell方法用於返回當前位置。
    current = fileobj.tell()
    # 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
    bucket.put_object('exampleobject.txt', fileobj)
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <input id="file" type="file" />
    <button id="upload">上傳</button>
    <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
    <script>
      const client = new OSS({
        // yourRegion填寫Bucket所在地區。以華東1(杭州)為例,yourRegion填寫為oss-cn-hangzhou。
        region: "yourRegion",
        // 從STS服務擷取的臨時存取金鑰(AccessKey ID和AccessKey Secret)。
        accessKeyId: "yourAccessKeyId",
        accessKeySecret: "yourAccessKeySecret",
        // 從STS服務擷取的安全性權杖(SecurityToken)。
        stsToken: "yourSecurityToken",
        // 填寫Bucket名稱。
        bucket: "examplebucket",
      });

      // 從輸入框擷取file對象,例如<input type="file" id="file" />。
      let data;
      // 建立並填寫Blob資料。
      //const data = new Blob(['Hello OSS']);
      // 建立並填寫OSS Buffer內容。
      //const data = new OSS.Buffer(['Hello OSS']);

      const upload = document.getElementById("upload");

      async function putObject(data) {
        try {
          // 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
          // 您可以通過自訂檔案名稱(例如exampleobject.txt)或檔案完整路徑(例如exampledir/exampleobject.txt)的形式實現將資料上傳到當前Bucket或Bucket中的指定目錄。
          // data對象可以自訂為file對象、Blob資料或者OSS Buffer。
          const options = {
            meta: { temp: "demo" },
            mime: "json",
            headers: { "Content-Type": "text/plain" },
          };
          const result = await client.put("examplefile.txt", data, options);
          console.log(result);
        } catch (e) {
          console.log(e);
        }
      }

      upload.addEventListener("click", () => {
        const data = file.files[0];
        putObject(data);
      });
    </script>
  </body>
</html>
using Aliyun.OSS;

// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫Bucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// 填寫本地檔案的完整路徑。如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
var localFilename = "D:\\localpath\\examplefile.txt";

// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    // 上傳檔案。
    client.PutObject(bucketName, objectName, localFilename);
    Console.WriteLine("Put object succeeded");
}
catch (Exception ex)
{
    Console.WriteLine("Put object failed, {0}", ex.Message);
}
// 構造上傳請求。
// 依次填寫Bucket名稱(例如examplebucket)、Object完整路徑(例如exampledir/exampleobject.txt)和本地檔案完整路徑(例如/storage/emulated/0/oss/examplefile.txt)。
// Object完整路徑中不能包含Bucket名稱。
PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", "/storage/emulated/0/oss/examplefile.txt");

// 設定檔案中繼資料為可選操作。
 ObjectMetadata metadata = new ObjectMetadata();
// metadata.setContentType("application/octet-stream"); // 設定content-type。
// metadata.setContentMD5(BinaryUtil.calculateBase64Md5(uploadFilePath)); // 校正MD5。
// 設定Object的存取權限為私人。
metadata.setHeader("x-oss-object-acl", "private");
// 設定Object的儲存類型為標準儲存。
metadata.setHeader("x-oss-storage-class", "Standard");
// 設定禁止覆蓋同名Object。
// metadata.setHeader("x-oss-forbid-overwrite", "true");
// 指定Object的對象標籤,可同時設定多個標籤。
// metadata.setHeader("x-oss-tagging", "a:1");
// 指定OSS建立目標Object時使用的伺服器端密碼編譯演算法 。
// metadata.setHeader("x-oss-server-side-encryption", "AES256");
// 表示KMS託管的使用者主要金鑰,該參數僅在x-oss-server-side-encryption為KMS時有效。
// metadata.setHeader("x-oss-server-side-encryption-key-id", "9468da86-3509-4f8d-a61e-6eab1eac****");

put.setMetadata(metadata);

try {
    PutObjectResult putResult = oss.putObject(put);

    Log.d("PutObject", "UploadSuccess");
    Log.d("ETag", putResult.getETag());
    Log.d("RequestId", putResult.getRequestId());
} catch (ClientException e) {
    // 用戶端異常,例如網路異常等。
    e.printStackTrace();
} catch (ServiceException e) {
    // 服務端異常。
    Log.e("RequestId", e.getRequestId());
    Log.e("ErrorCode", e.getErrorCode());
    Log.e("HostId", e.getHostId());
    Log.e("RawMessage", e.getRawMessage());
}
package main

import (
    "fmt"
    "os"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 建立OSSClient執行個體。
    // yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))    
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 填寫儲存空間名稱,例如examplebucket。
    bucket, err := client.Bucket("examplebucket")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 依次填寫Object的完整路徑(例如exampledir/exampleobject.txt)和本地檔案的完整路徑(例如D:\\localpath\\examplefile.txt)。
    err = bucket.PutObjectFromFile("exampledir/exampleobject.txt", "D:\\localpath\\examplefile.txt")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
}            
OSSPutObjectRequest * put = [OSSPutObjectRequest new];

// 填寫Bucket名稱,例如examplebucket。
put.bucketName = @"examplebucket";
// 填寫檔案完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
put.objectKey = @"exampledir/exampleobject.txt";
put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"];
// put.uploadingData = <NSData *>; // 直接上傳NSData。

// (可選)設定上傳進度。
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    // 指定當前上傳長度、當前已經上傳總長度、待上傳的總長度。
    NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
// 配置可選欄位。
// put.contentType = @"application/octet-stream";
// 設定Content-MD5。
// put.contentMd5 = @"eB5eJF1ptWaXm4bijSPyxw==";
// 設定Object的編碼方式。
// put.contentEncoding = @"identity";
// 設定Object的展示形式。
// put.contentDisposition = @"attachment";
// 可以在上傳檔案時設定檔案中繼資料或者HTTP頭部。
// NSMutableDictionary *meta = [NSMutableDictionary dictionary];
// 設定檔案中繼資料。
// [meta setObject:@"value" forKey:@"x-oss-meta-name1"];
// 設定Object的存取權限為私人。
// [meta setObject:@"private" forKey:@"x-oss-object-acl"];
// 設定Object的歸檔類型為標準儲存。
// [meta setObject:@"Standard" forKey:@"x-oss-storage-class"];
// 設定覆蓋同名目標Object。
// [meta setObject:@"true" forKey:@"x-oss-forbid-overwrite"];
// 指定Object的對象標籤,可同時設定多個標籤。
// [meta setObject:@"a:1" forKey:@"x-oss-tagging"];
// 指定OSS建立目標Object時使用的伺服器端密碼編譯演算法。
// [meta setObject:@"AES256" forKey:@"x-oss-server-side-encryption"];
// 表示KMS託管的使用者主要金鑰,該參數僅在x-oss-server-side-encryption為KMS時有效。
// [meta setObject:@"9468da86-3509-4f8d-a61e-6eab1eac****" forKey:@"x-oss-server-side-encryption-key-id"];
// put.objectMeta = meta;
OSSTask * putTask = [client putObject:put];

[putTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"upload object success!");
    } else {
        NSLog(@"upload object failed, error: %@" , task.error);
    }
    return nil;
}];
// waitUntilFinished會阻塞當前線程,但是不會阻塞上傳任務進程。
// [putTask waitUntilFinished];
// [put cancel];
#include <alibabacloud/oss/OssClient.h>
#include <fstream>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS帳號資訊。*/
            
    /* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填寫Bucket名稱,例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* 初始化網路等資源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    /* 填寫本地檔案完整路徑,例如D:\\localpath\\examplefile.txt,其中localpath為本地檔案examplefile.txt所在本地路徑。*/
    std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>("D:\\localpath\\examplefile.txt", std::ios::in | std::ios::binary);
    PutObjectRequest request(BucketName, ObjectName, content);

    /*(可選)請參見如下樣本設定存取權限ACL為私人(private)以及儲存類型為標準儲存(Standard)。*/
    //request.MetaData().addHeader("x-oss-object-acl", "private");
    //request.MetaData().addHeader("x-oss-storage-class", "Standard");

    auto outcome = client.PutObject(request);

    if (!outcome.isSuccess()) {
        /* 異常處理。*/
        std::cout << "PutObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* 釋放網路等資源。*/
    ShutdownSdk();
        return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
const char *object_name = "exampledir/exampleobject.txt";
const char *object_content = "More than just cloud.";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* 用char*類型的字串初始化aos_string_t類型。*/
    aos_str_set(&options->config->endpoint, endpoint);
    /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    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"));
    /* 是否使用了CNAME。0表示不使用。*/
    options->config->is_cname = 0;
    /* 設定網路相關參數,比如逾時時間等。*/
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* 在程式入口調用aos_http_io_initialize方法來初始化網路、記憶體等全域資源。*/
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* 用於記憶體管理的記憶體池(pool),等價於apr_pool_t。其實現代碼在apr庫中。*/
    aos_pool_t *pool;
    /* 重新建立一個記憶體池,第二個參數是NULL,表示沒有繼承其它記憶體池。*/
    aos_pool_create(&pool, NULL);
    /* 建立並初始化options,該參數包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全域配置資訊。*/
    oss_request_options_t *oss_client_options;
    /* 在記憶體池中分配記憶體給options。*/
    oss_client_options = oss_request_options_create(pool);
    /* 初始化Client的選項oss_client_options。*/
    init_options(oss_client_options);
    /* 初始化參數。*/
    aos_string_t bucket;
    aos_string_t object;
    aos_list_t buffer;
    aos_buf_t *content = NULL;
    aos_table_t *headers = NULL;
    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_list_init(&buffer);
    content = aos_buf_pack(oss_client_options->pool, object_content, strlen(object_content));
    aos_list_add_tail(&content->node, &buffer);
    /* 上傳檔案。*/
    resp_status = oss_put_object_from_buffer(oss_client_options, &bucket, &object, &buffer, headers, &resp_headers);
    /* 判斷上傳是否成功。*/
    if (aos_status_is_ok(resp_status)) {
        printf("put object from buffer succeeded\n");
    } else {
        printf("put object from buffer failed\n");      
    }
    /* 釋放記憶體池,相當於釋放了請求過程中各資源分派的記憶體。*/
    aos_pool_destroy(pool);
    /* 釋放之前分配的全域資源。*/
    aos_http_io_deinitialize();
    return 0;
}
require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  # Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
  endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
  # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  access_key_id: ENV['OSS_ACCESS_KEY_ID'],
  access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# 填寫Bucket名稱,例如examplebucket。
bucket = client.get_bucket('examplebucket')
# 上傳檔案。
bucket.put_object('exampleobject.txt', :file => 'D:\\localpath\\examplefile.txt')

使用命令列工具ossutil

關於使用ossutil簡單上傳的具體操作, 請參見簡單上傳

使用REST API

如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutObject

相關文檔

  • 推薦使用用戶端直傳的方式將檔案上傳到OSS。相對於服務端代理上傳,用戶端直傳避免了商務服務器中轉檔案,提高了上傳速度,節省了伺服器資源。更多資訊,請參見用戶端直傳

  • 在使用簡單上傳的情況下,可以攜帶Object Meta資訊對Object進行描述,例如設定Content-Type等標準HTTP頭,也可以設定自訂資訊。關於Object Meta的更多資訊,請參見設定檔案中繼資料

  • 在檔案上傳到OSS後,您可以通過上傳回調向指定的應用伺服器發起回調請求。具體操作,請參見上傳回調

  • 如果您希望對上傳的圖片進行壓縮、添加自訂樣式等操作。更多資訊,請參見圖片處理操作方式

  • 如果上傳圖片後需要擷取圖片大小資訊,您可以使用?x-oss-process=image/info返回圖片的基本資料。更多資訊, 參見擷取資訊

  • 如果您希望對上傳的圖片或者視頻等進行文字識別、字幕提取、視頻轉碼、產生視頻封面等處理,請參見ApsaraVideo for Media Processing

  • 檔案上傳完成後,您可以在URL中加入簽名資訊,以便將該URL轉給第三方實現授權訪問。更多資訊,請參見在URL中包含簽名

  • 通過檔案URL訪問檔案時是預覽或者下載的行為取決於網域名稱類型以及Bucket的建立時間。更多資訊,請參見通過檔案URL訪問檔案無法預覽而是以附件形式下載?

  • 使用Hadoop、Spark等運行批次工作時,可以選擇Object Storage Service作為儲存。上傳檔案後,您可以在ECI中訪問OSS資料。更多資訊,請參見在ECI中訪問OSS資料

  • 如果您需要在上傳時擷取進度條,請參見上傳進度條