1. 程式人生 > >Java專案整合阿里雲OSS上傳圖片

Java專案整合阿里雲OSS上傳圖片

工具類:

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import com.shineyoo.manager.util.common.utils.IdGen;
import com.shineyoo.manager.util.common.utils.PropertiesLoader;

/**

  • @class:AliyunOSSClientUtil
  • @descript:java使用阿里雲OSS儲存物件上傳圖片

*/
public class AliyunOSSClientUtil {
//log日誌
private static Logger logger = LoggerFactory.getLogger(AliyunOSSClientUtil.class);

private static PropertiesLoader loader = new PropertiesLoader("aliyunoss.properties");
//阿里雲API的內或外網域名  
private static String ENDPOINT;  
//阿里雲API的金鑰Access Key ID  
private static String ACCESS_KEY_ID;  
//阿里雲API的金鑰Access Key Secret  
private static String ACCESS_KEY_SECRET;  
//阿里雲API的bucket名稱  
private static String BACKET_NAME;  
//阿里雲API的資料夾名稱  
private static String FOLDER;

//初始化屬性  
static{  
    ENDPOINT = loader.getProperty("ENDPOINT");
    ACCESS_KEY_ID = loader.getProperty("ACCESS_KEY_ID");
    ACCESS_KEY_SECRET = loader.getProperty("ACCESS_KEY_SECRET");
    BACKET_NAME = loader.getProperty("BACKET_NAME");
    FOLDER = loader.getProperty("FOLDER");
}
/**
* 獲取配置
* @see
*/

public static String getConfig(String key) {
String value = loader.getProperty(key);
return value;
}

/** 
 * 獲取阿里雲OSS客戶端物件 
 * @return ossClient 
 */  
public static  OSSClient getOSSClient(){  
    return new OSSClient(ENDPOINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);  
}  

/** 
 * 建立儲存空間 
 * @param ossClient      OSS連線 
 * @param bucketName 儲存空間 
 * @return 
 */  
public  static String createBucketName(OSSClient ossClient,String bucketName){  
    //儲存空間  
    final String bucketNames=bucketName;  
    if(!ossClient.doesBucketExist(bucketName)){  
        //建立儲存空間  
        Bucket bucket=ossClient.createBucket(bucketName);  
        logger.info("建立儲存空間成功");  
        return bucket.getName();  
    }  
    return bucketNames;  
}  

/** 
 * 建立儲存空間 
 * @param ossClient      OSS連線 
 * @param bucketName 儲存空間 
 * @return 
 */  
public  static void putBucketACL(OSSClient ossClient,String bucketName){  
    //儲存空間  
    final String bucketNames=bucketName;  
    System.out.println(ossClient.doesBucketExist(bucketName));
    if(ossClient.doesBucketExist(bucketName)){  
        //修改儲存空間的許可權
        ossClient.setBucketAcl(bucketNames, CannedAccessControlList.PublicRead);
        logger.info("建立儲存空間成功");  
    }  
}  
  
/** 
 * 刪除儲存空間buckName 
 * @param ossClient  oss物件 
 * @param bucketName  儲存空間 
 */  
public static  void deleteBucket(OSSClient ossClient, String bucketName){    
    ossClient.deleteBucket(bucketName);     
    logger.info("刪除" + bucketName + "Bucket成功");    
}    
  
/** 
 * 建立模擬資料夾 
 * @param ossClient oss連線 
 * @param bucketName 儲存空間 
 * @param folder   模擬資料夾名如"qj_nanjing/" 
 * @return  資料夾名 
 */  
public  static String createFolder(OSSClient ossClient,String bucketName,String folder){  
    //資料夾名   
    final String keySuffixWithSlash =folder;  
    //判斷資料夾是否存在,不存在則建立  
    if(!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)){  
        //建立資料夾  
        ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));  
        logger.info("建立資料夾成功");  
        //得到資料夾名  
        OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);  
        String fileDir=object.getKey();  
        return fileDir;  
    }  
    return keySuffixWithSlash;  
}  
  
 /**   
    * 根據key刪除OSS伺服器上的檔案   
    * @param ossClient  oss連線 
    * @param bucketName  儲存空間  
    * @param folder  模擬資料夾名 如"qj_nanjing/" 
    * @param key Bucket下的檔案的路徑名+檔名 如:"upload/cake.jpg" 
    */      
   public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key){      
        ossClient.deleteObject(bucketName, folder + key);     
        logger.info("刪除" + bucketName + "下的檔案" + folder + key + "成功");    
   }   
   /**   
    * 根據key刪除OSS伺服器上的檔案   
    * @param key Bucket下的檔案的路徑名+檔名 如:"upload/cake.jpg"
    */      
   public static void deleteFile(String key){
      OSSClient ossClient = getOSSClient();
      ossClient.deleteObject(BACKET_NAME,key);     
      logger.info("刪除" + BACKET_NAME + "下的檔案" + key + "成功");    
   } 
  
/** 
 * 上傳圖片至OSS 
 * @param file 上傳檔案(檔案全路徑如:D:\\image\\cake.jpg) 
 * @return String 返回訪問路徑
 * */  
public static  String uploadObject2OSS(File file) {  
   OSSClient ossClient = getOSSClient();
    String resultStr = null;  
    String fileName = null;
    try {  
        //以輸入流的形式上傳檔案  
        InputStream is = new FileInputStream(file);  
        //檔名  如果出現重複,則重新生成名字,再上傳
        fileName = getfileName(file.getName());   
        if(ossClient.doesObjectExist(BACKET_NAME, FOLDER + fileName)){
           fileName = getfileName(file.getName());   
        }
        //檔案大小  
        Long fileSize = file.length();   
        //建立上傳Object的Metadata    
        ObjectMetadata metadata = new ObjectMetadata();  
        //上傳的檔案的長度  
        metadata.setContentLength(is.available());    
        //指定該Object被下載時的網頁的快取行為  
        metadata.setCacheControl("no-cache");   
        //指定該Object下設定Header  
        metadata.setHeader("Pragma", "no-cache");    
        //指定該Object被下載時的內容編碼格式  
        metadata.setContentEncoding("utf-8");    
        //檔案的MIME,定義檔案的型別及網頁編碼,決定瀏覽器將以什麼形式、什麼編碼讀取檔案。如果使用者沒有指定則根據Key或檔名的副檔名生成,  
        //如果沒有副檔名則填預設值application/octet-stream  
        metadata.setContentType(getContentType(fileName));    
        //指定該Object被下載時的名稱(指示MINME使用者代理如何顯示附加的檔案,開啟或下載,及檔名稱)  
        metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");    
        //上傳檔案   (上傳檔案流的形式)  
       PutObjectResult putResult = ossClient.putObject(BACKET_NAME, FOLDER + fileName, is, metadata);    
       resultStr = putResult.getETag();  
       logger.info("上傳阿里雲OSS伺服器成功." +resultStr);    
        //解析結果  
    } catch (Exception e) {  
        e.printStackTrace();  
         logger.error("上傳阿里雲OSS伺服器異常." + e.getMessage(), e);    
    }  
    return "http://"+BACKET_NAME+"."+ENDPOINT+"/"+FOLDER + fileName;  
}  
/** 
 * 上傳圖片至OSS 
 * @param in 上傳檔案流
 * @return String 返回訪問路徑,圖片儲存KEY
 * */  
public static  String uploadObject2OSS(InputStream in,String name,Long size) {  
   OSSClient ossClient = getOSSClient();
   String resultStr = null;  
   String fileName = null;
   try {  
      //檔名  如果出現重複,則重新生成名字,再上傳
      fileName = getfileName(name);   
      if(ossClient.doesObjectExist(BACKET_NAME, FOLDER + fileName)){
         fileName = getfileName(name);   
      }
      //檔案大小  
      Long fileSize = size;   
      //建立上傳Object的Metadata    
      ObjectMetadata metadata = new ObjectMetadata();  
      //上傳的檔案的長度  
      metadata.setContentLength(in.available());    
      //指定該Object被下載時的網頁的快取行為  
      metadata.setCacheControl("no-cache");   
      //指定該Object下設定Header  
      metadata.setHeader("Pragma", "no-cache");    
      //指定該Object被下載時的內容編碼格式  
      metadata.setContentEncoding("utf-8");    
      //檔案的MIME,定義檔案的型別及網頁編碼,決定瀏覽器將以什麼形式、什麼編碼讀取檔案。如果使用者沒有指定則根據Key或檔名的副檔名生成,  
      //如果沒有副檔名則填預設值application/octet-stream  
      metadata.setContentType(getContentType(fileName));    
      //指定該Object被下載時的名稱(指示MINME使用者代理如何顯示附加的檔案,開啟或下載,及檔名稱)  
      metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");    
      //上傳檔案   (上傳檔案流的形式)  
      PutObjectResult putResult = ossClient.putObject(BACKET_NAME, FOLDER + fileName, in, metadata);    
      resultStr = putResult.getETag();  
      logger.info("上傳阿里雲OSS伺服器成功." +resultStr);    
      //解析結果  
   } catch (Exception e) {  
      e.printStackTrace();  
      logger.error("上傳阿里雲OSS伺服器異常." + e.getMessage(), e);    
   }
   return BACKET_NAME+"."+ENDPOINT+"/"+FOLDER + fileName;  
}  

/** 
 * 通過檔名判斷並獲取OSS服務檔案上傳時檔案的contentType 
 * @param fileName 檔名 
 * @return 檔案的contentType 
 */  
public static  String getContentType(String fileName){  
    //檔案的字尾名  
    String fileExtension = fileName.substring(fileName.lastIndexOf("."));  
    if(".bmp".equalsIgnoreCase(fileExtension)) {  
        return "image/bmp";  
    }  
    if(".gif".equalsIgnoreCase(fileExtension)) {  
        return "image/gif";  
    }  
    if(".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)  || ".png".equalsIgnoreCase(fileExtension) ) {  
        return "image/jpeg";  
    }  
    if(".html".equalsIgnoreCase(fileExtension)) {  
        return "text/html";  
    }  
    if(".txt".equalsIgnoreCase(fileExtension)) {  
        return "text/plain";  
    }  
    if(".vsd".equalsIgnoreCase(fileExtension)) {  
        return "application/vnd.visio";  
    }  
    if(".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {  
        return "application/vnd.ms-powerpoint";  
    }  
    if(".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {  
        return "application/msword";  
    }  
    if(".xml".equalsIgnoreCase(fileExtension)) {  
        return "text/xml";  
    }  
    //預設返回型別  
    return "image/jpeg";  
}  

/** 
 * 修改檔名
 * @param fileName 檔名 
 * @return 檔案的新名稱 
 */  
public static  String getfileName(String fileName){  
   String fileType = fileName.substring(fileName.lastIndexOf("."), fileName.length());
   String name = IdGen.uuid()+fileType;
   System.out.println(fileName+"----"+name);
   return name;
   
}

  
//測試  
public static void main(String[] args) throws Exception {  
   /* //上傳檔案  
    String f="D:\\tu\\21107201_230758751000-2.jpg";  
    File file=new File(f);  
    try{
       String md5key = AliyunOSSClientUtil.uploadObject2OSS(file);    
       System.out.println("上傳後的檔案MD5數字唯一簽名:" + md5key);    
    }catch(Exception e){
       e.printStackTrace();
    }*/
   
   
    //初始化OSSClient  
    OSSClient ossClient=AliyunOSSClientUtil.getOSSClient();  
    //上傳檔案  
    String files="D:\\tu\\w1.png,D:\\tu\\w2.png,D:\\tu\\w3.png,D:\\tu\\w4.png,D:\\tu\\w5.png";  
    String[] file=files.split(",");  
    for(String filename:file){  
        //System.out.println("filename:"+filename);  
        File filess=new File(filename);  
        String md5key = AliyunOSSClientUtil.uploadObject2OSS(filess);    
        System.out.println("檔案地址:" + md5key);    
          
    }  
}  

}

業務層呼叫:

//獲取檔案
MultipartFile single = productProduct.getSingle();
String name = single.getOriginalFilename();//檔名字
String key;
try {
key = AliyunOSSClientUtil.uploadObject2OSS(single.getInputStream(),name,single.getSize());
productProduct.setAvatarUrl(key);//這裡存的是阿里雲上的檔案路徑
} catch (IOException e) {
e.printStackTrace();
}

pxm引入jar

com.aliyun.oss aliyun-sdk-oss 2.7.0

注意表單提交時form加屬性:enctype=“multipart/form-data”

html頁面:

上傳檔案:

照片提交回顯:

$(function () {
$("#file_upload").change(function () {
var $file = $(this);
var fileObj = $file[0];
var windowURL = window.URL || window.webkitURL;
var dataURL;
var $img = $("#preview");

    if (fileObj && fileObj.files && fileObj.files[0]) {
        dataURL = windowURL.createObjectURL(fileObj.files[0]);
        //alert($("#file_upload").val().files[0]);
        //$("#single").val(fileObj.files[0]);
        $img.attr('src', dataURL);
    } else {
        dataURL = $file.val();
        var imgObj = document.getElementById("preview");
        imgObj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
        imgObj.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = dataURL;

    }
});

});

ajax方式上傳:

    var mydata = document.getElementById("file_upload").files[0];
    formData = new FormData();
    formData.append("file", mydata);
    $.ajax({
        contentType:"multipart/form-data",
        url:prefix + "/add",
        type:"POST",
        data:formData,
        dataType:"text",
        processData: false, // 告訴jQuery不要去處理髮送的資料
        contentType: false, // 告訴jQuery不要去設定Content-Type請求頭
        success: function(result){
            alert(result);
        }
    });