最近公司要保存用戶的圖片信息到阿里雲,通過學習已經掌握了阿里雲基本上傳的開發步驟。過程仍是比較順利的,查看了不少博客,代碼都不是很全,本身爲了方便之後使用和回憶,因此我寫篇博客記錄一下當時的過程。由於api裏面有詳細的步驟,這裏我不在詳細描述,只寫代碼實現和大抵的步驟。html
①上傳阿里雲maven須要配置的jar包java
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency>
注:org.apache.httpcomponents必須爲4.4版本。web
若是mven裏面有4.3版本的httpclient 會形成版本衝突,配置以前先檢查mven裏面的配置。spring
若是有低版本,應先刪除再配置高版本的httpclient。(我由於這個半天都在報錯,切記)apache
②閱讀apiapi
地址:https://help.aliyun.com/document_detail/32010.html?spm=5176.doc32009.6.211.OeN2Uw安全
必須閱讀幾遍api,這樣流程會大抵熟悉服務器
③就是代碼部分(上傳接口)app
package com.zhongqi.ChessMember.client.web.controller.xaingqi; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectResult; import com.zhongqi.ChessMember.dto.UploadAddInfo; import com.zhongqi.ChessMember.entity.UploadFile; import com.zhongqi.ChessMember.service.xiangqi.UploadService; import com.zhongqi.common.controller.BaseController; import com.zhongqi.common.dto.JsonResponseResult; import com.zhongqi.common.util.BaseUtils; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by jordan on 16/10/24. * @author 寧春筍 */ @Controller @RequestMapping("/clientUpload") public class UploadController extends BaseController { Logger logger = Logger.getLogger(UploadController.class); @Autowired private UploadService uploadService; @RequestMapping("/upload") public void upload(@RequestParam(value = "file", required = false) MultipartFile uploadFile, HttpServletRequest request, HttpServletResponse response)throws Exception { JsonResponseResult result = new JsonResponseResult(); result.setCode(1); result.setMsg("導入文件失敗"); if (!uploadFile.isEmpty()) { try { // 文件保存路徑 String strPath = request.getSession().getServletContext().getRealPath("/uploadImgs"); System.out.println(" strPath"+ strPath); //得到上傳文件的名字 String fileName = uploadFile.getOriginalFilename(); System.out.print("fileName"+fileName); //拿到文件的流進行加密 FileInputStream fis = new FileInputStream(strPath + "/"+fileName); String fileMD5= DigestUtils.md5Hex(IOUtils.toByteArray(fis)); UploadFile uploadFile1=uploadService.checkUploadFileInfo(fileMD5); if (uploadFile1==null){ File file = new File(strPath + "/"+fileName); // 轉存文件到服務器 uploadFile.transferTo(file); /** * 從服務器讀取存儲阿里雲 * 上傳文件的名字:file.getName() * * 當前時間:getCurrentDate() * * 文件(bucketName裏面建立的)Constant.filePath * */ String key =Constant.filePath+ "/" +getCurrentDate()+"/"+fileName; System.out.println("key"+key); String filePath =strPath+ "/" +fileName; // 存儲阿里雲 putObject(Constant.bucketName, key,filePath); UploadAddInfo uploadAddInfo =new UploadAddInfo(); uploadAddInfo.setFileMD5(fileMD5); uploadAddInfo.setFilePath(key); uploadAddInfo.setUploadDate(new Date()); Integer uploadId= uploadService.addUploadinfo(uploadAddInfo); if (uploadId!=null){ result.setCode(0); result.setMsg("導入成功"); result.setResponse(uploadAddInfo); } } } catch (FileNotFoundException f) { logger.error(f); throw f; } } response(BaseUtils.toJsonFromObject(result), response,logger); } // 存儲阿里雲 private void putObject(String bucketName, String key, String filePath) throws FileNotFoundException { // 初始化OSSClient OSSClient client = DefaultOSSClient.getDefaultOSSClient(); // 獲取指定文件的輸入流 File file = new File(filePath); InputStream content = new FileInputStream(file); // 建立上傳Object的Metadata ObjectMetadata meta = new ObjectMetadata(); // 必須設置ContentLength meta.setContentLength(file.length()); Date expire = new Date(new Date().getTime() + 30 * 1000); meta.setExpirationTime(expire); // 上傳Object. PutObjectResult result = client.putObject(Constant.bucketName, key, content, meta); // 打印ETag System.out.println("etag--------------->" + result.getETag()); } //時間處理 private static String getCurrentDate(){ Date date =new Date(); SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyyMMddHHmmss"); String timeDate =simpleDateFormat.format(date); return timeDate; } }
④用到的配置工具類maven
DefaultOSSClient類
package com.zhongqi.ChessMember.client.web.controller.xaingqi; import com.aliyun.oss.OSSClient; import com.zhongqi.ChessMember.client.config.DefaultClientConfiguration; /** * Created by jordan on 16/10/21. * @author 寧春筍 */ public class DefaultOSSClient { /* * Constructs a client instance with your account for accessing OSS */ private static OSSClient client = new OSSClient(Constant.endpoint, Constant.accessKeyId, Constant.accessKeySecret, DefaultClientConfiguration.getDefalutClientConfig()); private DefaultOSSClient() { } public static OSSClient getDefaultOSSClient(){ if(client == null){ client = new OSSClient(Constant.endpoint,Constant.accessKeyId, Constant.accessKeySecret,DefaultClientConfiguration.getDefalutClientConfig()); } return client; } public static void shutdownOSSClient(){ client.shutdown(); client = null; } }
Constant類
Constant類
package com.zhongqi.ChessMember.client.web.controller.xaingqi; /** * Created by jordan on 16/10/21. * @author 寧春筍 */ public class Constant { public static String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; public static String accessKeyId = "你的accessKeyId"; public static String accessKeySecret = "你的accessKeySecret"; public static String bucketName = "本身建立的bucket"; public static String filePath="本身建立的上傳位置"; }
默認配置能夠查詢api本身定義
package com.zhongqi.ChessMember.client.config; import com.aliyun.oss.ClientConfiguration; /** * Created by jordan on 16/10/21. * 寧春筍 */ public class DefaultClientConfiguration { // 建立ClientConfiguration實例 private static final ClientConfiguration conf = new ClientConfiguration(); private DefaultClientConfiguration() { // 設置OSSClient使用的最大鏈接數,默認1024 conf.setMaxConnections(100); // 設置請求超時時間,默認50秒 conf.setConnectionTimeout(5000); // 設置失敗請求重試次數,默認3次 conf.setMaxErrorRetry(3); //Socket層傳輸數據的超時時間(單位:毫秒)。默認爲50000毫秒 conf.setSocketTimeout(2000); } public static ClientConfiguration getDefalutClientConfig(){ return conf; } }
⑤service實現
package com.zhongqi.ChessMember.service.xiangqi.impl; import com.zhongqi.ChessMember.dao.xiangqi.UploadDao; import com.zhongqi.ChessMember.dto.UploadAddInfo; import com.zhongqi.ChessMember.entity.UploadFile; import com.zhongqi.ChessMember.service.xiangqi.UploadService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * Created by jordan on 16/10/24. */ @Service("uploadService") public class UploadServiceImpl implements UploadService{ @Autowired private UploadDao uploadDao; //存儲上傳信息 @Override @Transactional public Integer addUploadinfo(UploadAddInfo uploadAddInfo) { return uploadDao.addUploadinfo(uploadAddInfo); } @Override public UploadFile checkUploadFileInfo(String fileMD5) { return uploadDao.checkUploadFileInfo(fileMD5); } }
⑥dao實現
package com.zhongqi.ChessMember.dao.xiangqi.impl; import com.zhongqi.ChessMember.dao.xiangqi.UploadDao; import com.zhongqi.ChessMember.dto.UploadAddInfo; import com.zhongqi.ChessMember.entity.UploadFile; import com.zhongqi.common.dao.impl.BaseDaoImpl; import org.apache.log4j.Logger; import org.springframework.stereotype.Repository; /** * Created by jordan on 16/10/24. * @author 寧春筍 */ @Repository("uploadDao") public class UploadImpl extends BaseDaoImpl implements UploadDao { Logger logger = Logger.getLogger(UploadImpl.class); //存儲上傳信息 @Override public Integer addUploadinfo(UploadAddInfo uploadAddInfo) { Integer result =0; UploadFile uploadFile =new UploadFile(); uploadFile.setFileMD5(uploadAddInfo.getFileMD5()); uploadFile.setFilePath(uploadAddInfo.getFilePath()); uploadFile.setUploadDate(uploadAddInfo.getUploadDate()); try { save(uploadFile); result=uploadFile.getId(); }catch (Exception e){ logger.error(e); } return result; } //效驗圖片MD5值 @Override public UploadFile checkUploadFileInfo(String fileMD5) { String hql = "from UploadFile where fileMD5=?"; Object[] params ={fileMD5}; UploadFile uploadFile =(UploadFile)get(hql,params); return uploadFile; } }
⑦實體和工具
package com.zhongqi.ChessMember.entity; import javax.persistence.*; import java.util.Date; /** * Created by jordan on 16/10/24. * @author 寧春筍 */ @Entity @Table(name="uploadFile") public class UploadFile { //主鍵 private Integer id; // 文件MD5值 private String fileMD5; // 存儲路徑 private String filePath; //上傳日期 private Date uploadDate; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id", unique = true, nullable = false) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="fileMD5",nullable=true) public String getFileMD5() { return fileMD5; } public void setFileMD5(String fileMD5) { this.fileMD5 = fileMD5; } @Column(name="filePath",nullable=true) public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } @Column(name="uploadDate",nullable=true) public Date getUploadDate() { return uploadDate; } public void setUploadDate(Date uploadDate) { this.uploadDate = uploadDate; } }
UploadAddInfo類
package com.zhongqi.ChessMember.dto; import java.util.Date; /** * Created by jordan on 16/10/24. */ public class UploadAddInfo { //主鍵 private Integer id; // 文件MD5值 private String fileMD5; // 存儲路徑 private String filePath; //上傳日期 private Date uploadDate; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getFileMD5() { return fileMD5; } public void setFileMD5(String fileMD5) { this.fileMD5 = fileMD5; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public Date getUploadDate() { return uploadDate; } public void setUploadDate(Date uploadDate) { this.uploadDate = uploadDate; } }
以上是上傳涉及的全部代碼,上傳是一個比較經常使用的模塊,徹底能夠單拉一個站點出來。以便之後服用,阿里雲存儲安全性也比較高,避免用戶數據的丟失。做爲一個菜鳥,但願你們多多支持。2016/11/1