圖片上傳阿裏雲(對象存儲OSS)
一、資源
詳細功能及使用方法,請參看“SDK手冊 > Java-SDK”,
鏈接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/preface.html?spm=5176.docoss/sdk/java-sdk/
調用OSS Java SDK的方法時,
當錯誤發生時,OSS Java SDK的方法會拋出異常,異常中包括錯誤碼、錯誤信息,詳細請參看“SDK手冊 > Java-SDK > 異常處理”,
鏈接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/exception.html?spm=5176.docoss/api-reference/error-response
OSS控制臺可以直觀的看到您調用OSS Java SDK的結果,OSS控制臺地址是:https://oss.console.aliyun.com/index#/
OSS控制臺使用方法請參看文檔中心的“控制臺用戶指南”指南的鏈接地址是:
https://help.aliyun.com/document_detail/oss/getting-started/get-started.html?spm=5176.docoss/user_guide
OSS的文檔中心地址:https://help.aliyun.com/document_detail/oss/user_guide/overview.html
OSS Java SDK的文檔地址:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/install.html?spm=5176.docoss/sdk/java-sdk
OSS開發過程中常見問題鏈接地址:https://help.aliyun.com/document_detail/32024.html?spm=5176.product31815.6.665.JuvIOS
OSS Java SDK依賴下列包:
- aliyun-sdk-oss-2.2.1.jar
- hamcrest-core-1.1.jar
- jdom-1.1.jar
- commons-codec-1.9.jar
- httpclient-4.4.1.jar(重點--版本一致)
- commons-logging-1.2.jar
- httpcore-4.4.1.jar(重點--版本一致)
- log4j-1.2.15.jar(是可選的,需要日誌功能的時加入該包)
若果是maven工程。則直接添加依賴即可如:
<!-- 註意版本很重要 --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.2.3</version> </dependency>
二、上代碼
//oss上傳圖片 public void attrcompress() throws IOException { String str=attachmentService.Upload(request, null, false);//false用來判斷是否需要上傳高清圖片 response.getWriter().write(str);//返回圖片地址 } //上傳的方法 public String Upload(HttpServletRequest request, String path, Boolean is_compress) { List<FileItem> files = ossService.analysis(request);//從頁面拿到文件list集合 ObjectNode resultMessage = JsonUtils.createObjectNode();//聲明最後返回結果的josn字符串. /** * 開始遍歷request中的文件 */ for (FileItem file : files) {//遍歷文件集合 if (file.getName() == null) { InputStream iss = null; continue; } String gid = DataUtils.getUUID(); if (is_compress) {//壓縮上傳保存 Attachment attachment_compress = this.Img_compress(file, path, gid); if (attachment_compress == null) { return "操作失敗1"; } else { resultMessage.set("compressAttr", JsonUtils.beanToJsonObject(attachment_compress)); return resultMessage.toString(); } } else if (is_compress == false) {//原圖上傳保存 Attachment attachment_source = this.Img_source(file, path, gid); if (attachment_source == null) { return "操作失敗2"; } else { resultMessage.set("sourceAttr", JsonUtils.beanToJsonObject(attachment_source)); } } else {//原圖和壓縮全部上傳保存 Attachment attachment_compress = this.Img_compress(file, path, gid); Attachment attachment_source = this.Img_source(file, path, gid); if (attachment_compress == null && attachment_source == null) { return "操作失敗3"; } else { resultMessage.set("sourceAttr", JsonUtils.beanToJsonObject(attachment_source)); resultMessage.set("compressAttr", JsonUtils. beanToJsonObject(attachment_compress)); return resultMessage.toString(); } } } if (resultMessage.isNull()) { return "操作失敗4"; } else { return resultMessage.toString(); } } //獲取請求參數 public List<FileItem> analysis(HttpServletRequest request) { List<FileItem> list = new ArrayList<FileItem>(); try { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<?> uploadFiles; //uploadFiles獲取請求參數為空,緣為springMvc已配讀取,此處為二次讀取,所以為空 uploadFiles = upload.parseRequest(request); Iterator<?> iterator = uploadFiles.iterator(); while (iterator.hasNext()) { Object object = iterator.next(); if (object instanceof FileItem) { list.add((FileItem) object); } } } catch (FileUploadException fue) { // log.error("文件上傳請求數據解析失敗", fue); fue.printStackTrace(); } return list; } //處理文件流 private Attachment Img_compress(FileItem file, String path, String gid) { String id = DataUtils.getUUID(); if (path == null) { path = "/temp/" + id; } /** * 獲取到圖片格式 */ String attrName = file.getName(); // 附件的名稱 String attType = attrName.substring(attrName.lastIndexOf(".") + 1); /** * 獲取到圖片模塊 */ String moudelName = file.getFieldName(); // 獲得附件的模塊名稱 /** * 定義壓縮圖的名稱 */ String compressAttName = moudelName + "_compress" + "." + attType;//定義縮略圖的名稱 /** * 開始壓縮 */ int width = 500; int heigth = 500; ByteArrayInputStream in = null; try (ByteArrayOutputStream out = new ByteArrayOutputStream(file.get().length)) { Image img = ImageIO.read(file.getInputStream()); if (img.getWidth(null) == -1) { return null; } else { int newWidth; int newHeight; double rate1 = ((double) img.getWidth(null)) / (double) width + 0.1; double rate2 = ((double) img.getHeight(null)) / (double) heigth + 0.1; // 根據縮放比率大的進行縮放控制 double rate = rate1 > rate2 ? rate1 : rate2; newWidth = (int) (((double) img.getWidth(null)) / rate); //將大於規定尺寸的圖片縮小,將小於規定尺寸的圖片放大 newHeight = (int) (((double) img.getHeight(null)) / rate); BufferedImage tag = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null); ImageWriter imgWrier; //創建壓縮的圖片,用來編碼和寫入圖像的抽象超類。此類必須由在 Java Image I/O 框架的上下文中寫出圖像的類為其創建子類。 ImageWriteParam imgWriteParams; imgWrier = ImageIO.getImageWritersByFormatName("jpg").next(); imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam( null); imgWriteParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); imgWriteParams.setCompressionQuality(0.3f); imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED); ColorModel colorModel = ColorModel.getRGBdefault(); imgWriteParams.setDestinationType( new javax.imageio.ImageTypeSpecifier( colorModel, colorModel. createCompatibleSampleModel(100, 100))); imgWrier.reset(); imgWrier.setOutput(ImageIO.createImageOutputStream(out)); imgWrier.write(null, new IIOImage(tag, null, null), imgWriteParams); out.flush(); in = new ByteArrayInputStream(out.toByteArray()); // out.close(); } } catch (IOException e) { e.printStackTrace(); // log.warn("圖片壓縮出現問題", e); } //上傳保存壓縮圖片 String url = ossService.uploadFile(path, in, compressAttName);//將附件保存到oss服務器(Url/文件/文件名) Attachment attr = new Attachment(); attr.setId(id); attr.setAtt_name(compressAttName); attr.setAtt_path(url); attr.setMoudel_name(moudelName); attr.setAtt_type(attType); attr.setUpload_time(DateUtils.getSystemDate()); attr.setDownload_count(0); attr.setGid(gid); attr.setIs_compress(1); // this.saveAttachmentDao(attr); // Boolean flag = this.contains(attr); if (attr!=null) { return attr; }else{ return null; } } //上傳文件 public String uploadFile(String uploadPath, InputStream input, String fileName) { String uploadPathName = processingPath(uploadPath) + DataUtils.getUUID(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentDisposition("attachment;filename=" + fileName); getOssClient().putObject(bucketName, uploadPathName, input, metadata); return getHttpURLByFileKey(uploadPathName); } //實例化服務端對象(oss) public OSSClient getOssClient() { if (client == null) { ClientConfiguration conf = new ClientConfiguration(); conf.setConnectionTimeout(timeout); conf.setMaxErrorRetry(3); client = new OSSClient(endpoint, accessKeyId, accessKeySecret);//oss應用所需參數 } return client; }
圖片上傳阿裏雲(對象存儲OSS)