全部产品
Search
文档中心

Object Storage Service:Form upload (Java SDK V1)

更新时间:Nov 26, 2025

Form upload adalah metode yang menggunakan formulir HTML untuk mengunggah objek ke bucket tertentu dengan ukuran maksimum file 5 GB.

Catatan penggunaan

  • Topik ini menggunakan titik akhir publik wilayah China (Hangzhou). Untuk mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama, gunakan titik akhir internal. Untuk detail wilayah dan titik akhir yang didukung, lihat Regions and endpoints.

  • Pada topik ini, instans OSSClient dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient dengan nama domain kustom atau Security Token Service (STS), lihat Configuration examples for common scenarios.

  • Untuk melakukan form upload, Anda harus memiliki izin oss:PutObject. Untuk informasi lebih lanjut, lihat Attach a custom policy to a RAM user.

Kode contoh

Kode contoh berikut menunjukkan cara melakukan form upload:

import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.internal.OSSUtils;
import com.aliyun.oss.model.Callback;
import org.apache.commons.codec.binary.Base64;

import javax.activation.MimetypesFileTypeMap;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import com.aliyun.oss.ClientException;

public class PostObjectSample {
    // Tentukan path lengkap file lokal yang akan diunggah.
    private String localFilePath = "yourLocalFile";
    // Titik akhir wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan titik akhir yang sebenarnya.
    private String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // Pasangan AccessKey Akun Alibaba Cloud memiliki izin atas semua operasi API. Menggunakan pasangan AccessKey merupakan operasi berisiko tinggi. Kami menyarankan Anda menggunakan RAM user untuk memanggil operasi API atau melakukan O&M rutin. Untuk membuat RAM user, login ke Konsol RAM.
    String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
    String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
    // Tentukan nama bucket.
    private String bucketName = "yourBucketName";
    // Tentukan path lengkap objek. Jangan sertakan nama bucket.
    private String objectName = "yourObjectName";
    // Tetapkan URL server callback. Contoh: http://oss-demo.oss-cn-hangzhou.aliyuncs.com:23450 atau http://127.0.0.1:9090.
    private String callbackServerUrl = "yourCallbackServerUrl";
    // Tetapkan nilai header Host dalam permintaan callback. Contoh: oss-cn-hangzhou.aliyuncs.com.
    private String callbackServerHost = "yourCallbackServerHost";    
    /**
     * Form upload.
     * @throws Exception
     */
    private void PostObject() throws Exception {
        // Tambahkan nama bucket ke URL. Format URL adalah http://yourBucketName.oss-cn-hangzhou.aliyuncs.com.
        String urlStr = endpoint.replace("http://", "http://" + bucketName+ ".");
        // Tetapkan peta formulir.
        Map<String, String> formFields = new LinkedHashMap<String, String>();
        // Tetapkan nama objek.
        formFields.put("key", this.objectName);
        // Tetapkan Content-Disposition.
        formFields.put("Content-Disposition", "attachment;filename="
                + localFilePath);
        // Tetapkan parameter callback.
        // Callback callback = new Callback();
        // Tetapkan URL server callback. Contoh: http://oss-demo.oss-cn-hangzhou.aliyuncs.com:23450 atau http://127.0.0.1:9090.
        // callback.setCallbackUrl(callbackServerUrl);
        // Tetapkan nilai header Host dalam permintaan callback, seperti oss-cn-hangzhou.aliyuncs.com.
        // callback.setCallbackHost(callbackServerHost);
        // Tetapkan nilai badan permintaan untuk callback.
        // callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}");
        // Tetapkan Content-Type permintaan callback.
        // callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);
        // Tetapkan parameter kustom untuk permintaan callback. Setiap parameter berupa pasangan kunci-nilai. Kunci harus diawali dengan x: dan menggunakan huruf kecil.
        // callback.addCallbackVar("x:var1", "value1");
        // callback.addCallbackVar("x:var2", "value2");
        // Tetapkan parameter callback dalam peta formulir.
        // setCallBack(formFields, callback);
        // Tetapkan OSSAccessKeyId.
        formFields.put("OSSAccessKeyId", accessKeyId);
        String policy = "{\"expiration\": \"2120-01-01T12:00:00.000Z\",\"conditions\": [[\"content-length-range\", 0, 104857600]]}";
        String encodePolicy = new String(Base64.encodeBase64(policy.getBytes()));
        // Tetapkan kebijakan.
        formFields.put("policy", encodePolicy);
        // Hasilkan signature.
        String signaturecom = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, encodePolicy);
        // Tetapkan signature.
        formFields.put("Signature", signaturecom);
        String ret = formUpload(urlStr, formFields, localFilePath);
        System.out.println("Post Object [" + this.objectName + "] ke bucket [" + bucketName + "]");
        System.out.println("post reponse:" + ret);
    }
    private static String formUpload(String urlStr, Map<String, String> formFields, String localFile)
            throws Exception {
        String res = "";
        HttpURLConnection conn = null;
        String boundary = "9431149156168";
        try {
            URL url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(30000);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("User-Agent",
                    "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");            
            conn.setRequestProperty("Content-Type",
                    "multipart/form-data; boundary=" + boundary);
            OutputStream out = new DataOutputStream(conn.getOutputStream());
            // Lakukan iterasi pada peta formulir, baca data, dan tulis data ke aliran output.
            if (formFields != null) {
                StringBuffer strBuf = new StringBuffer();
                Iterator<Map.Entry<String, String>> iter = formFields.entrySet().iterator();
                int i = 0;
                while (iter.hasNext()) {
                    Map.Entry<String, String> entry = iter.next();
                    String inputName = entry.getKey();
                    String inputValue = entry.getValue();
                    if (inputValue == null) {
                        continue;
                    }
                    if (i == 0) {
                        strBuf.append("--").append(boundary).append("\r\n");
                        strBuf.append("Content-Disposition: form-data; name=\""
                                + inputName + "\"\r\n\r\n");
                        strBuf.append(inputValue);
                    } else {
                        strBuf.append("\r\n").append("--").append(boundary).append("\r\n");
                        strBuf.append("Content-Disposition: form-data; name=\""
                                + inputName + "\"\r\n\r\n");
                        strBuf.append(inputValue);
                    }
                    i++;
                }
                out.write(strBuf.toString().getBytes());
            }
            // Baca informasi file dan tulis file yang akan diunggah ke aliran output.
            File file = new File(localFile);
            String filename = file.getName();
            String contentType = new MimetypesFileTypeMap().getContentType(file);
            if (contentType == null || contentType.equals("")) {
                contentType = "application/octet-stream";
            }
            StringBuffer strBuf = new StringBuffer();
            strBuf.append("\r\n").append("--").append(boundary)
                    .append("\r\n");
            strBuf.append("Content-Disposition: form-data; name=\"file\"; "
                    + "filename=\"" + filename + "\"\r\n");
            strBuf.append("Content-Type: " + contentType + "\r\n\r\n");
            out.write(strBuf.toString().getBytes());
            DataInputStream in = new DataInputStream(new FileInputStream(file));
            int bytes = 0;
            byte[] bufferOut = new byte[1024];
            while ((bytes = in.read(bufferOut)) != -1) {
                out.write(bufferOut, 0, bytes);
            }
            in.close();
            byte[] endData = ("\r\n--" + boundary + "--\r\n").getBytes();
            out.write(endData);
            out.flush();
            out.close();
            // Baca data yang dikembalikan.
            strBuf = new StringBuffer();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                strBuf.append(line).append("\n");
            }
            res = strBuf.toString();
            reader.close();
            reader = null;
        } catch (ClientException e) {
            System.err.println("Kirim pengecualian permintaan post: " + e);
            System.err.println(e.getErrorCode()+" msg="+e.getMessage());
            throw e;
        } finally {
            if (conn != null) {
                conn.disconnect();
                conn = null;
            }
        }
        return res;
    }
    private static void setCallBack(Map<String, String> formFields, Callback callback) {
        if (callback != null) {
            String jsonCb = OSSUtils.jsonizeCallback(callback);
            String base64Cb = BinaryUtil.toBase64String(jsonCb.getBytes());
            formFields.put("callback", base64Cb);
            if (callback.hasCallbackVar()) {
                Map<String, String> varMap = callback.getCallbackVar();
                for (Map.Entry<String, String> entry : varMap.entrySet()) {
                    formFields.put(entry.getKey(), entry.getValue());
                }
            }
        }
    }
    public static void main(String[] args) throws Exception {
        PostObjectSample ossPostObject = new PostObjectSample();
        ossPostObject.PostObject();
    }
}

Referensi

Untuk informasi lebih lanjut tentang operasi API untuk form upload, lihat PostObject.