利用阿里云oss实现上传视频和图片功能
生活随笔
收集整理的這篇文章主要介紹了
利用阿里云oss实现上传视频和图片功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
要想使用阿里云,全提是先開通阿里云的功能
查看oss的配置內容
先應用oss的依賴
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId></dependency>來一波阿里云工具類
package com.lza.util; import org.joda.time.DateTime; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClient; import com.aliyun.oss.OSSClientBuilder; 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Date; import java.util.UUID;/*** 阿里云客戶端*/public class AliOSSClientUtil {/** 日志 */public static Logger logger = LoggerFactory.getLogger(AliOSSClientUtil.class);/** 阿里云API的密鑰Access Key ID */public static String accessKeyId ="你的配置";/** 阿里云API的密鑰Access Key Secret */public static String accessKeySecret="你的配置";/** 阿里云API的內或外網域名 */public static String endpoint="你的配置";public static String bucketName="你的配置";/** 阿里云短信簽名名稱 *//*private static String signName = "*****";*//** 阿里云短信模板代碼 *//*private static String templateCode = "*****";@Value("{ali.folder}")private String folder;*//*** 獲取阿里云OSS客戶端對象** @return ossClient*/public static OSSClient getOSSClient() {return new OSSClient(endpoint, accessKeyId, accessKeySecret);}/*** 創建存儲空間** @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;}/*** 刪除存儲空間buckName** @param ossClient oss對象* @param bucketName 存儲空間*/public static void deleteBucket(OSSClient ossClient, String bucketName) {ossClient.deleteBucket(bucketName);logger.info("刪除" + bucketName + "Bucket成功");}/*** 根據key刪除OSS服務器上的文件** @param ossClient oss連接* @param bucketName 存儲空間* @param folder 模擬文件夾名* @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 + "成功");}/*** 創建模擬文件夾** @param ossClient oss連接* @param bucketName 存儲空間* @param folder 模擬文件夾名如* @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;}/*** 上傳圖片至OSS** @param ossClient oss連接* @param file 上傳文件(文件全路徑如:D:\\image\\cake.jpg)* @param bucketName 存儲空間* @param folder 模擬文件夾名* @return String 返回文件url*/public static String upload(OSSClient ossClient, File file, String bucketName, String folder) {String resultStr = null;try {InputStream is = new FileInputStream(file);String fileName = file.getName();ossClient.putObject(bucketName, folder + fileName, is);resultStr = "http://"+endpoint+"/"+folder+fileName;} catch (Exception e) {e.printStackTrace();logger.error("上傳阿里云OSS服務器異常." + e.getMessage(), e);}return resultStr;}/*** 上傳圖片至OSS** @param*** @return String 返回文件url*/public static String uploadVideo(MultipartFile file) {//上傳地址String uploadUrl=null;System.out.println(bucketName+endpoint+accessKeyId+accessKeySecret);try {//創建實例OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);System.out.println("ossClient"+ossClient);System.out.println("oss:"+ossClient);//判斷bucketName是否存在if(!ossClient.doesBucketExist(bucketName)){//創建bucketossClient.createBucket(bucketName);//設置bucket屬性ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);}//獲取上傳的文件流InputStream inputStream=file.getInputStream();//構建日期的文件夾路徑 avatar/2021/9/12/文件名String datePath= new DateTime().toString("yyy/MM/dd");//獲取上傳文件的全名稱String original = file.getOriginalFilename();//獲取uuid 隨機生成的,每次都不同 9c649622-7b7b-4fca-ba74-daae5ea4b3c8 變為9c6496227b7b4fcaba74daae5ea4b3c8String fileName = UUID.randomUUID().toString().replace("-", "");//獲取文件路徑的擴展名 meizi.jpg 就應該是jpgString fileType = original.substring(original.lastIndexOf("."));//并接文件名稱 9c6496227b7b4fcaba74daae5ea4b3c8.jpgString newName=fileName+fileType;//生成文件夾 avatar/2021/9/12/9c6496227b7b4fcaba74daae5ea4b3c8.jpgfileName= datePath+"/"+newName;//每次上傳的文字都是不能相同的---uuid方法 文件格式:yyyy/MM/dd+uuid//要實現圖片預覽效果,還需要設置//1.設置文件的ACL(權限),要么是公共讀,要么是公共讀寫//2.一定要設置文本類型(image/jpg)ObjectMetadata objectMetadata=new ObjectMetadata();//設置公共讀權限objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);objectMetadata.setContentType(getContentType(fileType));ossClient.putObject(bucketName, fileName, file.getInputStream(),objectMetadata);// 關閉OSSClient。ossClient.shutdown();//默認十年不過期Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);//獲取在線訪問的url bucket名稱 文件名 過期時間uploadUrl = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();}catch (Exception e){e.printStackTrace();}//返回數據是關鍵如果你直接返回uploadUrl那么后面就會出現很多參數,所以要進行截取System.out.println(uploadUrl);return uploadUrl.substring(0,uploadUrl.indexOf("?"));}/*** 通過文件名判斷并獲取OSS服務文件上傳時文件的contentType** @param fileName 文件名* @return 文件的contentType*/public static String getContentType(String fileName) {// 文件的后綴名String FilenameExtension = fileName.substring(fileName.lastIndexOf("."));if (FilenameExtension.equalsIgnoreCase(".pdf")) {return "application/pdf";}if (FilenameExtension.equalsIgnoreCase(".bmp")) {return "image/bmp";}if (FilenameExtension.equalsIgnoreCase(".gif")) {return "image/gif";}if (FilenameExtension.equalsIgnoreCase(".jpeg") ||FilenameExtension.equalsIgnoreCase(".jpg") ||FilenameExtension.equalsIgnoreCase(".png")) {return "image/jpg";}if (FilenameExtension.equalsIgnoreCase(".html")) {return "text/html";}if (FilenameExtension.equalsIgnoreCase(".txt")) {return "text/plain";}if (FilenameExtension.equalsIgnoreCase(".vsd")) {return "application/vnd.visio";}if (FilenameExtension.equalsIgnoreCase(".pptx") ||FilenameExtension.equalsIgnoreCase(".ppt")) {return "application/vnd.ms-powerpoint";}if (FilenameExtension.equalsIgnoreCase(".docx")){return "application/msword";}if (FilenameExtension.equalsIgnoreCase(".xml")) {return "text/xml";}if (FilenameExtension.equalsIgnoreCase(".mp4")) {//MP4格式return "video/mp4";}return "image/jpg";}/**//*** 阿里云短信驗證碼* @return*//*public static String smsCode(String phone){DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);IAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();String smsCode = RandomUtil.randomNumbers(6);request.setSysMethod(MethodType.POST);request.setSysVersion("2017-05-25");request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysAction("SendSms");request.putQueryParameter("RegionId", "cn-hangzhou");request.putQueryParameter("PhoneNumbers", phone);request.putQueryParameter("SignName", signName);request.putQueryParameter("TemplateCode", templateCode);request.putQueryParameter("TemplateParam","{code:"+smsCode+"}");try {CommonResponse response = client.getCommonResponse(request);String data = response.getData();} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}return smsCode;}*/ }運行實例,上傳一波視頻,這個根據你的接口而定,參數是MultipartFile file
//上傳視頻@PostMapping("uploadVideos")@RequiredTokenpublic ResponseBean upload(MultipartFile file, Video video, HttpServletRequest request) throws IOException {//在請求頭中獲取user信息User user = (User) request.getAttribute("user");//獲取用戶的idvideo.setUid(user.getId());/* //獲取分類idvideo.setCategoryId(category_id);*///修改和發布時間Date date=new Date();video.setCreatedAt(date);video.setUpdatedAt(date);**//上傳阿里云String url = AliOSSClientUtil.uploadVideo(file);//靜態方法//阿里云oss截取視頻中某一幀作為封面String cover = url + "?x-oss-process=video/snapshot,t_30000,f_jpg,w_0,h_0,m_fast,ar_auto"; //6.設置視頻信息video.setCover(cover);//設置視頻封面video.setLink(url);//設置視頻地址**//video.setCategoryId(category_id);//設置類別idSystem.out.println(video);ResponseBean uploadVideo=videosClient.publish(video);//boolean save = videoService.save(video);return ResponseBean.success("上傳視頻成功"+uploadVideo);}運行結果
總結
以上是生活随笔為你收集整理的利用阿里云oss实现上传视频和图片功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cocos2d-lua加载cocostu
- 下一篇: 阿里云访问控制——OSS——STS