Unggah formulir memungkinkan aplikasi web mengunggah file langsung ke OSS menggunakan formulir HTML standar. Topik ini menjelaskan cara menggunakan C# SDK V2 untuk menghasilkan informasi seperti Post Signature dan Post Policy, serta memanggil metode HTTP POST untuk mengunggah file ke OSS.
Perhatian
Kode contoh dalam topik ini menggunakan ID Wilayah China (Hangzhou),
cn-hangzhou, sebagai contoh. Secara default, titik akhir publik digunakan. Jika Anda ingin mengakses OSS dari produk Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir OSS, lihat Wilayah dan Titik Akhir OSS.Ukuran objek yang diunggah menggunakan unggah formulir tidak boleh melebihi 5 GB.
Kode contoh
Berikut adalah kode contoh yang menunjukkan proses lengkap unggah formulir. Langkah-langkah utama adalah sebagai berikut:
Inisialisasi Konfigurasi dan Parameter: Atur wilayah, bucket, kunci objek, dan produk. Muat kredensial akses dari variabel lingkungan dan siapkan konten untuk diunggah.
Buat Post Policy: Tentukan periode validitas dan kondisi untuk permintaan unggah.
Serialize dan Enkode Policy: Serialize Policy menjadi string JSON dan lakukan enkode Base64.
Hasilkan Kunci Tanda Tangan: Gunakan algoritma HMAC-SHA256 untuk menghasilkan kunci awal berdasarkan AccessKeySecret. Kemudian, hash secara berurutan tanggal, wilayah, produk, dan jenis permintaan untuk menghasilkan kunci tanda tangan akhir.
Buat Badan Permintaan: Buat data formulir multipart yang sesuai dengan spesifikasi HTTP POST. Tambahkan kunci objek, Policy yang di-enkode Base64, versi tanda tangan, informasi kredensial, tanggal permintaan, tanda tangan, dan data untuk diunggah.
Buat dan Eksekusi Permintaan: Buat klien HTTP dan kirim permintaan POST ke titik akhir OSS. Proses tanggapan dan keluarkan kode status serta informasi header respons.
using OSS = AlibabaCloud.OSS.V2; // Buat alias untuk Alibaba Cloud OSS SDK untuk menyederhanakan penggunaan selanjutnya.
using System.Globalization;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
var region = "cn-hangzhou"; // Diperlukan. Atur wilayah tempat bucket berada. Topik ini menggunakan China (Hangzhou) sebagai contoh. Atur wilayah ke cn-hangzhou.
var bucket = "nama bucket Anda"; // Diperlukan. Nama bucket.
var key = "kunci objek Anda"; // Diperlukan. Nama objek tujuan untuk diunggah.
var product = "oss"; // Diperlukan. Pengenal produk untuk OSS.
// Konversi array byte menjadi string heksadesimal.
static string ToHexString(byte[] data, bool lowercase)
{
var sb = new StringBuilder();
for (var i = 0; i < data.Length; i++) sb.Append(data[i].ToString(lowercase ? "x2" : "X2"));
return sb.ToString();
}
// Tambahkan tanda kutip ganda ke string.
static string quote(string value)
{
return $"\"{value}\"";
}
// Muat konfigurasi default dari OSS SDK. Konfigurasi ini secara otomatis membaca informasi kredensial (seperti AccessKey) dari variabel lingkungan.
var cfg = OSS.Configuration.LoadDefault();
// Secara eksplisit atur untuk menggunakan variabel lingkungan untuk mendapatkan kredensial untuk verifikasi identitas (format: OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET).
var credentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
var credentials = credentialsProvider.GetCredentials();
// Konten untuk diunggah.
var content = "hello oss";
// Bangun Policy (kebijakan unggah).
var utcTime = DateTime.UtcNow;
var date = utcTime.ToUniversalTime().ToString("yyyyMMdd", CultureInfo.InvariantCulture);
var dateTime = utcTime.ToUniversalTime().ToString("yyyyMMdd'T'HHmmss'Z'", CultureInfo.InvariantCulture);
var expiration = utcTime.AddHours(1); // Tanda tangan berlaku selama 1 jam.
// Bangun informasi kredensial.
var credentialInfo = $"{credentials.AccessKeyId}/{date}/{region}/{product}/aliyun_v4_request";
// Bangun JSON Policy.
var policyMap = new Dictionary<string, Object>()
{
// Atur waktu kedaluwarsa kebijakan.
{ "expiration",
expiration.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss.000'Z'", CultureInfo.InvariantCulture)
},
// Atur kondisi unggah.
{ "conditions", new Object[]{
// Objek harus diunggah ke bucket yang ditentukan.
new Dictionary<string, string>() {{ "bucket", bucket } },
// Tentukan versi tanda tangan.
new Dictionary<string, string>() {{ "x-oss-signature-version", "OSS4-HMAC-SHA256" } },
// Tentukan informasi kredensial.
new Dictionary<string, string>() {{ "x-oss-credential", credentialInfo } },
// Tentukan waktu permintaan.
new Dictionary<string, string>() {{ "x-oss-date", dateTime } },
// Batasi rentang panjang konten unggahan.
new Object[]{"content-length-range", 1, 1024 },
//new Object[]{"eq", "$success_action_status", "201"},
//new Object[]{"starts-with", "$key", "user/eric/"},
//new Object[]{"in", "$content-type", new string[]{"image/jpg", "image/png"}},
//new Object[]{ "not-in", "$cache-control", new string[]{ "no-cache" } },
}
},
};
// Serialize menjadi string JSON.
var policy = JsonSerializer.Serialize(policyMap);
// Lakukan enkode Base64 pada Policy.
var stringToSign = Convert.ToBase64String(Encoding.UTF8.GetBytes(policy));
// Hasilkan kunci tanda tangan.
using var kha = new HMACSHA256();
// Kunci awal dihasilkan dari AccessKeySecret.
var ksecret = Encoding.UTF8.GetBytes("aliyun_v4" + credentials.AccessKeySecret);
// Hasilkan kunci tanda tangan level demi level.
kha.Key = ksecret;
var hashDate = kha.ComputeHash(Encoding.UTF8.GetBytes(date));
kha.Key = hashDate;
var hashRegion = kha.ComputeHash(Encoding.UTF8.GetBytes(region));
kha.Key = hashRegion;
var hashProduct = kha.ComputeHash(Encoding.UTF8.GetBytes(product));
kha.Key = hashProduct;
var signingKey = kha.ComputeHash(Encoding.UTF8.GetBytes("aliyun_v4_request"));
// Hitung tanda tangan akhir.
kha.Key = signingKey;
var signature = ToHexString(kha.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)), true);
// Bangun data formulir multipart.
using var formData = new MultipartFormDataContent();
// Tangani masalah tanda kutip untuk batas.
var boundary = formData.Headers.ContentType!.Parameters.ElementAt(0).Value!;
formData.Headers.ContentType.Parameters.ElementAt(0).Value = boundary.Trim('"');
// Tambahkan bidang formulir - nama kunci objek.
formData.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(key)), quote("key"));
// Anda dapat menambahkan metadata.
//formData.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(value)), quote("x-oss-"));
// Tambahkan Policy.
formData.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(stringToSign)), quote("policy"));
// Tambahkan informasi terkait tanda tangan.
formData.Add(new ByteArrayContent(Encoding.UTF8.GetBytes("OSS4-HMAC-SHA256")), quote("x-oss-signature-version"));
formData.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(credentialInfo)), quote("x-oss-credential"));
formData.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(dateTime)), quote("x-oss-date"));
formData.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(signature)), quote("x-oss-signature"));
// Tambahkan konten untuk diunggah.
formData.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(content)), quote("file"));
// Kirim permintaan POST ke OSS.
using var hc = new HttpClient();
var result = await hc.PostAsync($"http://{bucket}.oss-{region}.aliyuncs.com/", formData);
// Cetak hasil unggah.
Console.WriteLine("PostObject selesai"); // Menunjukkan bahwa operasi selesai.
Console.WriteLine($"Kode Status: {result.StatusCode}"); // Kode status HTTP.
Console.WriteLine("Header Respons:"); // Informasi header respons.
result.Headers.ToList().ForEach(x => Console.WriteLine(x.Key + " : " + String.Join(",", x.Value.ToList()))); // Lintasi dan cetak semua header respons.Referensi
Untuk kode contoh lengkap unggah formulir, lihat postObject.cs.