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);
}
});