java上傳圖片到阿里雲oss雲端儲存中,返回url連結地址
阿新 • • 發佈:2019-02-18
前言:最近要做一個入口網站,圖片較多,所以要採用圖片伺服器,我這裡採用的是阿里雲的oss雲端儲存,1.個數無限制,2.阿里雲備份3,效能也不錯.
oss對於圖片的處理,也有api,但是我這裡上傳的圖片只需要加個水印,所以只需要在oss那邊設定一個樣式,那麼每次上傳的圖片都會帶水印,其餘的圖片的處理,沒使用過,不太瞭解,但是oss提供在url中直接對圖片進行處理,但是這種圖片處理的不太好 (個人覺得).
使用前pom.xml中引入:
<!-- oss --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.7.0</version> </dependency>
工具類(需要的引數,自己去開通服務,自己去設定,就懂了):
import java.io.*; import java.net.URL; import java.util.Date; import java.util.Random; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectResult; import weisheng.bizhijia.oss.ImgException; import org.springframework.stereotype.Controller; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; /** * 阿里雲 OSS工具類 * * @author Monkey * @date 2017年9月30日下午3:38:09 * @version 1.0 */ @Controller public class OSSClientUtil { public static final Logger logger = LoggerFactory.getLogger(OSSClientUtil.class); // endpoint private String endpoint = ""; // accessKey private String accessKeyId = ""; private String accessKeySecret = ""; // 空間 private String bucketName = ""; // 檔案儲存目錄 private String filedir = ""; private OSSClient ossClient; public OSSClientUtil() { ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 初始化 */ public void init() { ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 銷燬 */ public void destory() { ossClient.shutdown(); } /** * 上傳圖片 * * @param url * @throws ImgException */ public void uploadImg2Oss(String url) throws ImgException { 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 ImgException("圖片上傳失敗"); } } public String uploadImg2Oss(MultipartFile file) throws ImgException { if (file.getSize() > 10 * 1024 * 1024) { throw new ImgException("上傳圖片大小不能超過10M!"); } 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 ImgException("圖片上傳失敗"); } } /** * 獲得圖片路徑 * * @param fileUrl * @return */ public String getImgUrl(String fileUrl) { System.out.println(fileUrl); if (!StringUtils.isEmpty(fileUrl)) { String[] split = fileUrl.split("/"); return this.getUrl(this.filedir + split[split.length - 1]); } return null; } /** * 上傳到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, filedir + fileName, instream, objectMetadata); ret = putResult.getETag(); } catch (IOException e) { logger.error(e.getMessage(), e); } finally { try { if (instream != null) { instream.close(); } } catch (IOException e) { e.printStackTrace(); } } return ret; } /** * 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(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10); // 生成URL URL url = ossClient.generatePresignedUrl(bucketName, key, expiration); if (url != null) { return url.toString(); } return null; } }
SSM框架使用:
controller:
import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.ResponseBody; import org.springframework.web.multipart.MultipartFile; import com.alibaba.fastjson.JSONObject; import weisheng.bizhijia.service.UpImgService; /** * 圖片上傳 * @author Monkey * @date 2017年9月30日下午3:37:00 * @version 1.0 */ @Controller public class UpImgController { public static final Logger logger = LoggerFactory.getLogger(UpImgController.class); @Autowired private UpImgService upImgService; @RequestMapping(value = "/headImgUpload", produces = "text/html;charset=UTF-8") @ResponseBody public String headImgUpload(HttpServletRequest request, MultipartFile file) { Map<String, Object> value = new HashMap<String, Object>(); try { String url = upImgService.updateHead(file); logger.debug("圖片路徑{}",url); value.put("data", url); value.put("code", 0); value.put("msg", "圖片上傳成功"); } catch (Exception e) { e.printStackTrace(); value.put("code", 2000); value.put("msg", "圖片上傳成功"); } return JSONObject.toJSONString(value); } }
service:
import org.springframework.web.multipart.MultipartFile;
import weisheng.bizhijia.oss.ImgException;
public interface UpImgService {
String updateHead(MultipartFile file)throws ImgException;
}
serviceImpl:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import weisheng.bizhijia.oss.ImgException;
import weisheng.bizhijia.oss.OSSClientUtil;
import weisheng.bizhijia.service.UpImgService;
@Service
public class UpImgServiceImpl implements UpImgService {
public static final Logger logger = LoggerFactory.getLogger(UpImgServiceImpl.class);
@Override
public String updateHead(MultipartFile file) throws ImgException {
if (file == null || file.getSize() <= 0) {
throw new ImgException("file不能為空");
}
OSSClientUtil ossClient=new OSSClientUtil();
String name = ossClient.uploadImg2Oss(file);
String imgUrl = ossClient.getImgUrl(name);
String[] split = imgUrl.split("\\?");
return split[0];
}
}