天天看點

OSS 檔案上傳(阿裡雲對象存儲空間)

OSS 檔案上傳(阿裡雲對象存儲空間)

檔案上傳

此檔案上傳可上傳各類正常的檔案對象,例如:圖檔的png/jpg/gif、視訊的MP4/MOV、文檔檔案等,基本上都可以通過這個方法上傳;

1、官方文檔:

簡單上傳:分為流式上傳和檔案上傳。流式上傳使用InputStream作為檔案的資料源。檔案上傳使用本地檔案作為OSS檔案的資料源。

https://help.aliyun.com/document_detail/84781.html?spm=a2c4g.11174283.6.944.21967da2h9PbDz

上傳形式還有:表單上傳、斷點上傳、分片上傳等,文檔都在路徑中可找到;

2、jar包:

阿裡雲官方依賴包(看着就那麼幾個,其實裡面東西不少,檔案上傳中真正用的也不算多)

https://gosspublic.alicdn.com/AliyunJavaSDK/3.10.2/javadoc/index.html?spm=a2c4g.11186623.2.11.160c6592adkTzv

第三步的代碼中使用得到的主要有這麼幾個,這些隻是那幾個jar包中的幾個子類:

import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;      

3、同步上傳代碼:

// OSS所在服務區位址(在所購買的OSS存儲對象空間資訊中會有,一般也就是杭州的)
private static String endpoint="https://oss-cn-hangzhou.aliyuncs.com";
// OSS對象存儲空間通路身份驗證賬戶和密鑰
private static String accessKeyId="*************";
private static String accessKeySecret="********************";
// OSS對象存儲空間名
private static String bucketName="*********************";
// OSS存儲空間中的檔案目錄
private static String fileDir = "***/***/";

private OSSClient ossClient;

public OSSUpload1() {
        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    }

/**
 * @Author qtl
 * @Description 同步上傳
 * @Date 18:31 2020/10/14
 * @Param [file]
 * @return java.lang.String
 **/
public String uploadImg2Oss(MultipartFile file) {
    // 擷取檔案名
    String originalFilename = file.getOriginalFilename();
    String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
    Random random = new Random();
    String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
    try {
        InputStream inputStream = file.getInputStream();
        this.uploadFile2OSS(inputStream, name);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return name;
}

/**
 * @Author qtl
 * @Description 上傳到OSS伺服器 如果同名檔案會覆寫伺服器上的,是以在檔案命名上采用時間戳(毫秒級)來命名上傳成功的檔案
 * @Date 10:55 2020/9/16
 * @Param [instream, fileName]
 * @return java.lang.String
 **/
public String uploadFile2OSS(InputStream instream, String fileName) {
    String ret = "";
    try {
        // 建立上傳Object的Metadata
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentLength(instream.available());
        objectMetadata.setCacheControl("no-cache");
        objectMetadata.setHeader("Pragma", "no-cache");

        objectMetadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));
        objectMetadata.setContentDisposition("inline;filename=" + fileName);
        // 上傳檔案
        PutObjectResult putResult = ossClient.putObject(bucketName, fileDir + fileName, instream, objectMetadata);
        ret = putResult.getETag();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (instream != null) {
                instream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  // 這個傳回值就是上傳成功後在OSS檔案對象存儲的檔案名【例:1607605931087.jpg】
    return ret;
}      

上面的代碼使用的是本地檔案上傳的形式,在使用此代碼時需要有兩個條件:

  1、開通OSS服務;

  2、建立存儲空間(檔案存儲路徑其實也可以不用建立,直接在代碼中寫上路徑,在上傳過程中如果發現沒有此目錄就會自動建立);

  3、建立AccessKey。