COS對象存儲服務的使用

---------------------------------------------------------------------------------------------
[版權申明:本文系做者原創,轉載請註明出處] 
文章出處: http://blog.csdn.net/sdksdk0/article/details/53639792
做者:朱培      ID:sdksdk0     

--------------------------------------------------------------------------------------------html

在不少圖片上傳以及文件上傳下載操做的時候,我以前一直使用的是nginx在服務器中劃分出一個靜態的文件服務器,我主要用於存放圖片。而後由於某種緣由,而後我換成了COS。java

官網的簡介是這樣的:nginx

對象存儲服務(Cloud Object Service)是面向企業和我的開發者提供的高可用,高穩定,強安全的雲端存儲服務。您能夠將任意數量和形式的非結構化數據放入COS,並在其中實現數據的管理和處理。COS支持標準的Restful API接口,您能夠快速上手使用,按實際使用量計費,無最低使用限制。git


而後我最開始是抱着死馬當活馬醫的心態來使用的,進度上面要求我是要儘快完成的,並且我發現對於我這種小網站來講使用這個COS服務基本上是免費的,簡直就是撿到寶的感受,哈哈!因此我就趕忙放棄了個人nginx圖片服務器。而後去github上面下載他們的官方文檔。github

https://github.com/tencentyun/cos-java-sdk-v4
apache

在在裏面有個demo.java,而後直接拿過來用就好了。由於我項目上傳的圖片是要按年月日自動生成目錄來存放的,因此官方提供的那段代碼是很是不夠用的。json

maven座標是:api

<dependency>
				<groupId>com.qcloud</groupId>
				<artifactId>cos_api</artifactId>
				<version>4.2</version>
			</dependency>

通常在真實項目中只導入這個是不行的,還須要加入http的jar包,因此還須要:並且這個版本還要匹配,不然在本地localhost的時候是能夠用的,可是一道服務器上就會說你少jar包了。

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpmime</artifactId>
			<version>4.3.1</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpcore</artifactId>
			<version>4.3</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.3.1</version>
		</dependency>

資源初始化:


// 設置用戶屬性, 包括appid, secretId和SecretKey
        // 這些屬性能夠經過cos控制檯獲取(https://console.qcloud.com/cos)
        long appId = 1000000;
        String secretId = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
        String secretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
        // 設置要操做的bucket
        String bucketName = "xxxxxxxxx";
        // 初始化客戶端配置
        ClientConfig clientConfig = new ClientConfig();
        // 設置bucket所在的區域,好比廣州(gz), 天津(tj)
        clientConfig.setRegion("gz");
        // 初始化祕鑰信息
        Credentials cred = new Credentials(appId, secretId, secretKey);
        // 初始化cosClient
        COSClient cosClient = new COSClient(clientConfig, cred);


我只使用了其中的文件上傳功能:安全


// 1. 上傳文件(默認不覆蓋)
        // 將本地的local_file_1.txt上傳到bucket下的根分區下,並命名爲sample_file.txt
        // 默認不覆蓋, 若是cos上已有文件, 則返回錯誤
        String cosFilePath = "/sample_file.txt";
        String localFilePath1 = "src/test/resources/bigfile.txt";
        UploadFileRequest uploadFileRequest =
                new UploadFileRequest(bucketName, cosFilePath, localFilePath1);
        uploadFileRequest.setEnableSavePoint(false);
        uploadFileRequest.setEnableShaDigest(false);
        String uploadFileRet = cosClient.uploadFile(uploadFileRequest);
        System.out.println("upload file ret:" + uploadFileRet);

這段代碼只是一個入門程序,因此在咱們實際應用中確定是須要進行修改的。例如我圖片上傳的吧,進來的是一個二進制流文件,總不能用String來接收吧,因此我將其改變了一下:

我傳進去的是一個MultipartFile。因此接收我須要一個byte[].很是方便就改好了。服務器

MultipartFile uploadFile

 // 1. 上傳文件(默認不覆蓋)
	        // 將本地的local_file_1.txt上傳到bucket下的根分區下,並命名爲sample_file.txt
	        // 默認不覆蓋, 若是cos上已有文件, 則返回錯誤
	        String cosFilePath = "/images"+imagePath+"/"+newName;
	        byte[] localFilePath1 = uploadFile.getBytes();
	        UploadFileRequest uploadFileRequest =
	                new UploadFileRequest(bucketName, cosFilePath, localFilePath1);
	        uploadFileRequest.setEnableSavePoint(false);
	        uploadFileRequest.setEnableShaDigest(false);
	        String uploadFileRet = cosClient.uploadFile(uploadFileRequest);

那麼我須要按年月日來生成目錄,因此我須要這樣。

// 生成一個新的文件
			// 取原始文件名
			String oldName = uploadFile.getOriginalFilename();
			// 生成新文件名
//		UUID.randomUUID();
			String newName = IDUtils.genImageName();
			newName = newName + oldName.substring(oldName.lastIndexOf("."));
			// 圖片上傳
			String imagePath = new DateTime().toString("/yyyy/MM/dd");

因此完整代碼就以下了:


@Override
	public Map uploadPicture(MultipartFile uploadFile) {
		Map resultMap = new HashMap();
		
		try {
			// 生成一個新的文件
			// 取原始文件名
			String oldName = uploadFile.getOriginalFilename();
			// 生成新文件名
//		UUID.randomUUID();
			String newName = IDUtils.genImageName();
			newName = newName + oldName.substring(oldName.lastIndexOf("."));
			// 圖片上傳
			String imagePath = new DateTime().toString("/yyyy/MM/dd");

			  // 設置用戶屬性, 包括appid, secretId和SecretKey
	        // 這些屬性能夠經過cos控制檯獲取(https://console.qcloud.com/cos)
	       long appId = 1000000;
        String secretId = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
        String secretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
        // 設置要操做的bucket
        String bucketName = "xxxxxxxxx";
	        // 初始化客戶端配置
	        ClientConfig clientConfig = new ClientConfig();
	        // 設置bucket所在的區域,好比廣州(gz), 天津(tj)
	        clientConfig.setRegion("gz");
	        // 初始化祕鑰信息
	        Credentials cred = new Credentials(appId, secretId, secretKey);
	        // 初始化cosClient
	        COSClient cosClient = new COSClient(clientConfig, cred);
	        ///////////////////////////////////////////////////////////////
	        // 文件操做 //
	        ///////////////////////////////////////////////////////////////
	        // 1. 上傳文件(默認不覆蓋)
	        // 將本地的local_file_1.txt上傳到bucket下的根分區下,並命名爲sample_file.txt
	        // 默認不覆蓋, 若是cos上已有文件, 則返回錯誤
	        String cosFilePath = "/images"+imagePath+"/"+newName;
	        byte[] localFilePath1 = uploadFile.getBytes();
	        UploadFileRequest uploadFileRequest =
	                new UploadFileRequest(bucketName, cosFilePath, localFilePath1);
	        uploadFileRequest.setEnableSavePoint(false);
	        uploadFileRequest.setEnableShaDigest(false);
	        String uploadFileRet = cosClient.uploadFile(uploadFileRequest);
			
	        //System.out.println("upload file ret:" + uploadFileRet);
			
			
	        String json=JsonUtils.objectToJson(uploadFileRet);
			//System.out.println(json.toString());
			
			
			resultMap.put("error", 0);
			resultMap.put("url", IMAGE_BASE_URL +"/images"+imagePath+"/"+newName);
			
			
			return resultMap;
		} catch (Exception e) {
			resultMap.put("error", 1);
			resultMap.put("message", "文件上傳發生異常");
			return resultMap;
		}
	}

這個IMAGE_BASE_URL就是這個對象存儲的位置。例如你隨便上傳一個文件的時候,都會給你一個文件的地址的前綴部分。




完成以後能夠在控制檯查看,或者網址訪問,若是須要圖片的時候,就把這個url拿出用便可,例如我就是放在img標籤的src裏就能夠直接使用了。




前面的工具類IDUtils.java


public class IDUtils {

	/**
	 * 圖片名生成
	 */
	public static String genImageName() {
		//取當前時間的長整形值包含毫秒
		long millis = System.currentTimeMillis();
		//long millis = System.nanoTime();
		//加上三位隨機數
		Random random = new Random();
		int end3 = random.nextInt(999);
		//若是不足三位前面補0
		String str = millis + String.format("%03d", end3);
		
		return str;
	}
}






總結:使用對象存儲服務是一種很是高效便捷的方式,並且使用起來仍是挺簡單的。點個贊。

相關文章
相關標籤/搜索