文件上傳
之前做的文件上傳是將文件上傳到tomcat本地硬盤上,然后通過虛擬路徑訪問該文件。
但是如果在tomcat集群環境,這種方案肯定是不行的,所以需要用分布式的文件系統來存取文件。
這里我們使用阿里雲的oss服務,來存儲文件數據(圖片、小視頻、js、css.html)
1.阿里雲登陸注冊
https://help.aliyun.com/learn/learningpath/oss.html
創建bucket
獲取四個關鍵屬性
| AccessKey | LTAI5tBxZTXL91xi8hBekESS |
|---|---|
| AccessKey Secret | YXhkQIfHeyfhxWa9lhTbTfCIfJ3EKy |
| 服務器域名Endpoint | oss-cn-beijing.aliyuncs.com |
| 數據倉庫 bucket | zkp-01 |
2.OSS代碼實現
- 導包
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
- 引入工具類OSSClientUtil修改屬性為自己的bucket
// endpoint 域名 機房
private String endpoint = "oss-cn-beijing.aliyuncs.com";
// accessKey 用戶的Id
private String accessKeyId = "LTAI5tBxZTXL91xi8hBekESS";
// 用戶的秘鑰
private String accessKeySecret = "YXhkQIfHeyfhxWa9lhTbTfCIfJ3EKy";
// 倉庫
private String bucketName = "zkp-01";
// 文件存儲目錄
private String filedir = "images/";
- 在controller當中調用
//異步上傳照片
@RequestMapping("/doAddPhoto")
public @ResponseBody boolean doAddPhoto(@RequestParam("file") MultipartFile file,HttpSession session, String picName) throws IOException {
User user = (User)session.getAttribute("user");
if (!file.isEmpty()){//文件非空,上傳到服務器
//使用時創建一個,多例模式
OSSClientUtil ossClientUtil = new OSSClientUtil();
ossClientUtil.uploadFile2OSS(file.getInputStream(),file.getOriginalFilename());
//獲取網絡地址,通過文件名稱
String url = ossClientUtil.getUrl(file.getOriginalFilename());
//創建用戶相片對象,添加新信息
UserProfilePhoto userPhoto = new UserProfilePhoto();
userPhoto.setPicUrl(url);
userPhoto.setPicName(picName);
userPhoto.setUserId(user.getId());
PhotoService.insert(userPhoto);
return true;
}else {
return false;
}
}
3.SMS(發送短信,實現手機號短信登陸)
- 導包
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
- 引入工具類AliSmsUtil,修改部分屬性
//產品域名,開發者無需替換,以下常量基本不變
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
private static final String REGION_ID = "cn-hangzhou";
private static final String PRODUCT="Dysmsapi";
public static final String ACCESS_KEY_ID = "LTAI4GHFHhok7nJ7cA77GSw9";
public static final String ACCESS_SECRET = "mGr8Q4D7mDFksn0VJA31S421M89ncU";
public static final String DEFAULT_SIGNNAME = "ABC商城";
public static final String DEFAULT_TEMPLATE_CODE = "SMS_206420122";
- 創建一個線程類SendSmsTask,進行異步調用
public class SendSmsTask implements Runnable {
private AliSmsUtil aliSmsUtil;
private String phone;
private String code;
public SendSmsTask(AliSmsUtil aliSmsUtil, String phone,String code) {
this.aliSmsUtil = aliSmsUtil;
this.phone = phone;
this.code=code;
}
@Override
public void run() {
try {
aliSmsUtil.sendValidateCodeMessage2AliyunSms(phone, code);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 具體業務
//短信驗證碼登陸
@RequestMapping("/msgLogin")
public @ResponseBody boolean msgLogin(String code,HttpSession session){
//獲得用戶驗證碼,與redis中的進行比對
String codes =(String) redisTemplate.boundValueOps("msg").get();
System.out.println(code);
System.out.println(codes);
if (code.equals(codes)){//用戶登陸成功
User user = userService.selectByPrimaryKey(3);
List<Menu> menuList = menuService.findMenuByUserId(user.getId());
session.setAttribute("menuList",menuList);
session.setAttribute("user",user);
return true;
}else {
return false;
}
}
//發送驗證碼
@RequestMapping("/sendMsg")
public @ResponseBody ResponseVo sendMsg(String phone) {
ResponseVo responseVo = new ResponseVo();
responseVo.setCode("1");
String code = "";
//生成隨機數
Random random = new Random();
for (int i=1;i<=6;i++){
code += ""+ random.nextInt(10);
}
//將驗證嗎放入redis
redisTemplate.boundValueOps("msg").set(code);
System.out.println("code="+code);
SendSmsTask sendSmsTask = new SendSmsTask(new AliSmsUtil(),phone,code);
sendSmsTask.run();
return responseVo;
}
