1. 程式人生 > >圖片上傳阿裏雲(對象存儲OSS)

圖片上傳阿裏雲(對象存儲OSS)

setgid dpa lag 對象存儲 path emf bytearray close node

一、資源

詳細功能及使用方法,請參看“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)