--------------------------------------------------------------------------------------------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>
<!-- 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);
我傳進去的是一個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; } }
完成以後能夠在控制檯查看,或者網址訪問,若是須要圖片的時候,就把這個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; } }
總結:使用對象存儲服務是一種很是高效便捷的方式,並且使用起來仍是挺簡單的。點個贊。