OSS對象存儲從入門到使用

什麼是OSS對象存儲??

詳細解釋參考官方API

OSS對象存儲主要使用於什麼場景??

圖片和音視頻等應用的海量存儲

OSS可用於圖片、音視頻、日誌等海量文件的存儲。各種終端設備、Web網站程序、移動應用可以直接向OSS寫入或讀取數據。OSS支持流式寫入和文件寫入兩種方式。

猿校長

網頁或者移動應用的靜態和動態資源分離

利用BGP帶寬,OSS可以實現超低延時的數據直接下載。OSS也可以配合阿里雲CDN加速服務,爲圖片、音視頻、移動應用的更新分發提供最佳體驗。

猿校長

雲端數據處理

上傳文件到OSS後,可以配合媒體處理服務和圖片處理服務進行雲端的數據處理。

猿校長

主要使用步驟(以Springboot熱部署爲例):

  • 在pom.xml文件添加依賴
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.8.3</version>
</dependency>
  • 編寫配置文件(以阿里雲服務器的OSS對象存儲爲例),主要思想分兩步走
    第一步:先創建客戶端,配置endpoint,accessKeyId,accessKeySecret,bucketName,host,imgdir,filedir等詳細信息
@Component
public class OSSClientUtil {

    protected static final Logger log = LoggerFactory.getLogger(OSSClientUtil.class);

    private String endpoint = "自己的endpoint";

    private String accessKeyId = "自己的accessKeyId";

    private String accessKeySecret = "自己的accessKeySecret";

    private String bucketName = "自己的bucketName";

    private String host = "自己的項目主機";

    //圖片存儲目錄
    private String imgdir = "寫啥隨意/";
    //文件存儲目錄
    private String filedir = "寫啥隨意/";

    public void changeFiledir(String filedir) {
    }

    /**
     * 上傳圖片
     * @param file
     * @return
     * @throws Exception
     */
    public String uploadImg2Oss(MultipartFile file) throws Exception {
        if (file.getSize() > 10 * 1024 * 1024) {
            throw new Exception("上傳圖片大小不能超過10M");
        }
        String originalFilename = file.getOriginalFilename();
        String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
        Random random = new Random();
        String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
        try {
            // TODO: 2020/6/2   update 
            InputStream inputStream =  file.getInputStream();
            this.uploadImg2Oss(inputStream, name);
            return name;
        } catch (Exception e) {
            log.info("文件目錄爲:"+ getUrl(bucketName));
            throw new Exception("上傳失敗...");
        }
    }

    /**
     * 上傳圖片獲取fileurl
     * @param inputStream 輸入流
     * @param fileurl 文件路徑
     * @return 上傳成功
     */
    private String uploadImg2Oss(InputStream inputStream, String fileurl) {
        String ret = "";
        try {
            //創建上傳Object的Metadata
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentLength(inputStream.available());
            objectMetadata.setCacheControl("no-cache");
            objectMetadata.setHeader("Pragma","no-cache");
            objectMetadata.setContentType(getcontentType(fileurl.substring(fileurl.lastIndexOf("."))));
            objectMetadata.setContentDisposition("inline;filename=" + fileurl);

            //上傳文件
            OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
            PutObjectResult putObjectResult = ossClient.putObject(bucketName,imgdir + fileurl,inputStream,objectMetadata);
            ret = putObjectResult.getETag();
        }catch (Exception e){
            log.error(e.getMessage(),e);

        }finally {
            try {
                if(inputStream != null){
                    inputStream.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return ret;
    }

    /**
     * 獲取文件路徑
     * @param fileUrl 文件路徑
     * @return
     */

    public String getImgUrl(String fileUrl) {
        if(StringUtils.isNotEmpty(fileUrl)){
            String[] split = fileUrl.split("/");
//            String url = this.getImgUrl(this.imgdir + split[split.length - 1]);
            String url = this.imgdir + split[split.length - 1];
            //log.info("該圖片的路徑爲",url);
            return url;
        }
        return null;
    }

    /**
     * 刪除文件
     * @param filename 文件名稱
     */
    public void deleteFile(GenericRequest filename) {
        OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
        String fileName = getFileName(filename);
        ossClient.deleteObject(bucketName,imgdir+fileName);
        ossClient.shutdown();
    }
    public static String getFileName(GenericRequest path){
        String fileName = new File(String.valueOf(path)).getName();
        //return fileName.substring(0, fileName.indexOf("?"));
        return fileName;
    }
    /**
     *生成url連接
     * @param key 
     * @return
     */
    public String getUrl(String key){

        //設置URL過期間爲10年
        Date expiration = new Date(System.currentTimeMillis() + 3600*1000*24*365*10);
        //生成URL
        OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
        URL url = ossClient.generatePresignedUrl(bucketName,key,expiration);
        if(url != null){
            return url.toString();
        }
        return null;
    }

    /**
     *
     * @param FilenameExtension 文件後綴格式
     * @return
     */

    public static String getcontentType(String FilenameExtension) {
        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
            return "image/bmp";
        }
        if (FilenameExtension.equalsIgnoreCase(".gif")) {
            return "image/gif";
        }
        if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                FilenameExtension.equalsIgnoreCase(".jpg") ||
                FilenameExtension.equalsIgnoreCase(".png")) {
            return "image/jpeg";
        }
        if (FilenameExtension.equalsIgnoreCase(".html")) {
            return "text/html";
        }
        if (FilenameExtension.equalsIgnoreCase(".txt")) {
            return "text/plain";
        }
        if (FilenameExtension.equalsIgnoreCase(".vsd")) {
            return "application/vnd.visio";
        }
        if (FilenameExtension.equalsIgnoreCase(".pptx") ||
                FilenameExtension.equalsIgnoreCase(".ppt")) {
            return "application/vnd.ms-powerpoint";
        }
        if (FilenameExtension.equalsIgnoreCase(".docx") ||
                FilenameExtension.equalsIgnoreCase(".doc")) {
            return "application/msword";
        }
        if (FilenameExtension.equalsIgnoreCase(".xml")) {
            return "text/xml";
        }
        return "image/jpeg";
    }
}

第二步:創建文件上傳工具類

public class OssuploadUtil {
    public String updateHead(MultipartFile file) throws Exception {

        if (file == null || file.getSize() <= 0) {

            throw new Exception("file不能爲空");
        }

        OSSClientUtil ossClient = new OSSClientUtil();

        String fileUrl = ossClient.uploadImg2Oss(file);

        String imgUrl = ossClient.getImgUrl(fileUrl);

        String[] split = imgUrl.split("\\?");

        return split[0];

    }

    /**

     * 上傳圖片到指定的文件夾


     * @param file

     * @param filedir

     * @return

     * @throws Exception

     */

    public String updateHead(MultipartFile file, String filedir) throws Exception {

        if (file == null || file.getSize() <= 0) {

            throw new Exception("file不能爲空");

        }

        OSSClientUtil ossClient = new OSSClientUtil();

        ossClient.changeFiledir(filedir);

        String name = ossClient.uploadImg2Oss(file);

        String imgUrl = ossClient.getImgUrl(name);

        String[] split = imgUrl.split("\\?");

        return split[0];

    }
    /**

     * 上傳多張圖片,然後拼接所有的url

     *

     * @param image

     * @return

     */

    public Result uploadReturnUrl(List<String> image) {

        StringBuilder imageStr = new StringBuilder();

        for (int i = 0; i < image.size(); i++) {

            MultipartFile file = Base64tTransformUtil.base64ToMultipart(image.get(i));

            try {

                String url = this.updateHead(file);

                System.out.println("第" + (i + 1) + "張圖片路徑: " + url);

                if (i + 1 == image.size()) {

                    imageStr.append(url);

                } else {

                    imageStr.append(url + ",");

                }

            } catch (Exception e) {

                e.printStackTrace();

                return new Result().fail("圖片上傳失敗!!!");

            }

        }

        return new Result().success(imageStr.toString(), "圖片上傳成功");

    }

    /**

     * 上傳一張圖片

     *

     * @param image

     * @return

     */

    public Result oneuploadReturnUrl(String image) {

        String url;

        MultipartFile file = Base64tTransformUtil.base64ToMultipart(image);

        try {

            url = this.updateHead(file);

            System.out.println("圖片路徑: " + url);

        } catch (Exception e) {

            e.printStackTrace();

            return new Result().fail("圖片上傳失敗!!!");

        }

        return new Result().success(url, "圖片上傳成功");

    }



    /**

     * 上傳一張圖片到是定文件將夾

     *

     * @param image

     * @return

     */

    public Result oneuploadReturnUrlToPoint(String image, String filedir) {

        String url;

        MultipartFile file = Base64tTransformUtil.base64ToMultipart(image);

        try {

            url = this.updateHead(file, filedir);

            System.out.println("圖片路徑: " + url);

        } catch (Exception e) {

            e.printStackTrace();

            return new Result().fail("圖片上傳失敗!!!");

        }

        return new Result().success(url, "圖片上傳成功");

    }

    /**

     *

     * @MethodName: deleteFile

     * @Description: 單文件刪除

     * @param fileUrl 需要刪除的文件url

     * @return boolean 是否刪除成功

     */

    public boolean deleteFile(String fileUrl){

        OSSClientUtil ossClient = new OSSClientUtil();



        /**

         * 根據url獲取bucketName

         */

        String bucketName = OssuploadUtil.getBucketName(fileUrl);

        /**

         * 根據url獲取fileName

         */

        String fileName = OssuploadUtil.getFileName(fileUrl);

        if(bucketName==null||fileName==null) {

            return false;

        }

        try {

            GenericRequest request = new DeleteObjectsRequest(bucketName).withKey(fileName);

            ossClient.deleteFile(request);

        } catch (Exception oe) {

            oe.printStackTrace();

            return false;

        }

        return true;

    }



    /**

     *

     * @MethodName: getBucketName

     * @Description: 根據url獲取bucketName

     * @param fileUrl 文件url

     * @return String bucketName

     */

    public static String getBucketName(String fileUrl){

        String http = "http://";

        String https = "https://";

        int httpIndex = fileUrl.indexOf(http);

        int httpsIndex = fileUrl.indexOf(https);

        int startIndex  = 0;

        if(httpIndex==-1){

            if(httpsIndex==-1){

                return null;

            }else{

                startIndex = httpsIndex+https.length();

            }

        }else{

            startIndex = httpIndex+http.length();

        }

        int endIndex = fileUrl.indexOf(".oss-");

        return fileUrl.substring(startIndex, endIndex);

    }



    /**

     *

     * @MethodName: getFileName

     * @Description: 根據url獲取fileName

     * @param fileUrl 文件url

     * @return String fileName

     */

    public static String getFileName(String fileUrl){

        String str = "aliyuncs.com/";

        int beginIndex = fileUrl.indexOf(str);

        if(beginIndex==-1) {

            return null;

        }

        return fileUrl.substring(beginIndex+str.length());

    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章