一: 頁面 html
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <base href="<%=basePath%>"> </head> <body> <form action="<%=basePath%>/aly/aliyun/headImgUpload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="提交"> </form> </body> </html>
二: 後臺 使用的是spring的文件接受類 使用MultipartFile接收java
@Controller @RequestMapping("/aly/aliyun") public class ALiYunOSSController { @RequestMapping(value = "/headImgUpload", method = RequestMethod.POST) @ResponseBody public String headImgUpload(HttpServletRequest request, MultipartFile file)throws Exception { String head = updateHead(file); return head; } public String updateHead(MultipartFile file) throws Exception { if (file == null || file.getSize() <= 0) { throw new Exception("頭像不能爲空"); } String nameHz= file.getOriginalFilename(); //上傳的文件名 + 後綴 如 asd.png String type = ""; if(nameHz.contains(".png") || nameHz.contains(".jpg")){ type="/img"; } if(nameHz.contains(".mp4") || nameHz.contains(".ogv")){ type="/video"; }else { type="/file"; } OssClienUtils ossClient = new OssClienUtils(); String keyName = ossClient.uploadImg2Oss(file,type); String imgUrl = ossClient.getImgUrl(keyName); return imgUrl; } }
三 : 阿里雲OSS 封裝的工具類web
package com.szy.project.utils; import java.io.*; import java.net.URL; import java.util.Date; import java.util.Random; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectResult; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; /** * 阿里雲 OSS文件類 參考文檔 https://help.aliyun.com/product/31815.html?spm=5176.750001.2.8.SZvzsM * * @author sunzhenyang */ public class OssClienUtils { Log log = LogFactory.getLog(OssClienUtils.class); // endpoint以北京爲例,其它region請按實際狀況填寫 private String endpoint = "http://oss-cn-beijing.aliyuncs.com"; // accessKey和accessKeySecret 爲購買阿里雲服務時官方提供 private String accessKeyId = "LTAIuB5R5******"; private String accessKeySecret = "56DOZQ2yRPE8n*****"; //空間 private String bucketName = "image"; //文件存儲目錄 (上傳時在key前面加上目錄 默認建立) private String date = "img/"; private OSSClient ossClient; public OssClienUtils() { ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 銷燬 */ public void destory() { ossClient.shutdown(); } /** * 上傳圖片 直接獲取本地資源路徑 * * @param url * @throws Exception */ public void uploadImg2Oss(String url) throws Exception { File fileOnServer = new File(url); FileInputStream fin; try { fin = new FileInputStream(fileOnServer); String[] split = url.split("/"); this.uploadFile2OSS(fin, split[split.length - 1]); } catch (FileNotFoundException e) { throw new Exception("圖片上傳失敗"); } } /** * 上傳圖片 * @param file * @return key 可根據key獲取上到到服務器的志願和刪除等操做 * @throws Exception */ public String uploadImg2Oss(MultipartFile file,String typeDate) throws Exception { this.date=typeDate; // if (file.getSize() > 1024 * 1024) { // throw new Exception("上傳圖片大小不能超過1M!"); // } String originalFilename = file.getOriginalFilename(); String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); Random random = new Random(); String name = random.nextInt(10000) + System.currentTimeMillis() + substring; try { InputStream inputStream = file.getInputStream(); this.uploadFile2OSS(inputStream, name); return name; } catch (Exception e) { throw new Exception("圖片上傳失敗"); } } /** * 上傳到OSS服務器 若是同名文件會覆蓋服務器上的 * * @param instream 文件流 * @param fileName 文件名稱 包括後綴名 * @return 出錯返回"" ,惟一MD5數字簽名 */ public String uploadFile2OSS(InputStream instream, String fileName) { String ret = ""; try { //建立上傳Object的Metadata ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(instream.available()); objectMetadata.setCacheControl("no-cache"); objectMetadata.setHeader("Pragma", "no-cache"); objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf(".")))); objectMetadata.setContentDisposition("inline;filename=" + fileName); //上傳文件 PutObjectResult putResult = ossClient.putObject(bucketName, date + fileName, instream, objectMetadata); ret = putResult.getETag(); } catch (IOException e) { log.error(e.getMessage(), e); } finally { try { if (instream != null) { instream.close(); } } catch (IOException e) { e.printStackTrace(); } } return ret; } /** * 得到圖片路徑 * * @param fileUrl * @return */ public String getImgUrl(String fileUrl) { if (!StringUtils.isEmpty(fileUrl)) { String[] split = fileUrl.split("/"); return this.getUrl(this.date + split[split.length - 1]); } return null; } /** * Description: 判斷OSS服務文件上傳時文件的contentType * * @param FilenameExtension 文件後綴 * @return String */ public static String getcontentType(String FilenameExtension) { 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/jpeg"; } 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") || FilenameExtension.equalsIgnoreCase("doc")) { return "application/msword"; } if (FilenameExtension.equalsIgnoreCase("xml")) { return "text/xml"; } return "image/jpeg"; } /** * 得到url連接 * * @param key * @return */ public String getUrl(String key) { // 設置URL過時時間爲10年 3600l* 1000*24*365*10 Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10); // 生成URL URL url = ossClient.generatePresignedUrl(bucketName, key, expiration); if (url != null) { return url.toString(); } return null; } /** * 刪除單個文件 */ public void delFile(String key){ ossClient.deleteObject(bucketName, key); } }