***

9443 ワード

一.APPアップロードサービスを開発するには、ストレージのサポートが必要です.では、EMCのソリューションは次のようになります.
1.1直接画像をサービスのハードディスクに保存する
  • 1. 利点:開発が便利で、コストが
  • 低い
  • 2. 欠点:拡張困難
  • 1.2分散ファイルシステムによるストレージ
  • 1. 利点:拡張
  • を容易に実現
  • 2. 欠点:開発の複雑さがやや大きい(特に複雑な機能を開発する)
  • 1.3 nfsを使用したストレージ
  • 1. 利点:開発が便利
  • 2. 欠点:24,5679182の導入とメンテナンスに関する知識が必要です.
    1.4サードパーティのストレージサービスの使用
  • 1. 利点:開発が簡単で、強力な機能を持ち、メンテナンスフリー
  • 2. 欠点:料金
  • ここでは、第1、4のソリューションを採用し、サードパーティのサービスはアリクラウドのOSSサービスを選択します.
     
    二.コンフィギュレーション
    2.1依存のインポート
    
        com.aliyun.oss
        aliyun-sdk-oss
        2.8.3
    

    2.2 aliyun.propertiesプロファイル
    aliyun.endpoint=
    aliyun.accessKeyId=
    aliyun.accessKeySecret=
    aliyun.bucketName=
    aliyun.urlPrefix=

    2.3 AliyunConfigの作成
    @Configuration
    @PropertySource(value = {"classpath:aliyun.properties"})
    @ConfigurationProperties(prefix = "aliyun")
    @Data
    public class AliyunConfig {
        private String endpoint;
        private String accessKeyId;
        private String accessKeySecret;
        private String bucketName;
        private String urlPrefix;
        @Bean
        public OSS oSSClient() {
        return new OSSClient(endpoint, accessKeyId, accessKeySecret);
        }
    }
    

    三.ファイルアップロード(画像、APP)
    3.1画像
    //        
    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
    ".jpeg", ".gif", ".png"};

     3.2 APP-OSS
     /**
         * APK      oss
         *
         * @param request
         * @return
         */
        //  @RequestMapping(value = "/upload", method = RequestMethod.POST)
        @ResponseBody
        public Map upload(HttpServletRequest request) {
            try {
                MultipartHttpServletRequest fileRequest = (MultipartHttpServletRequest) request;
                MultipartFile file = fileRequest.getFile("file");
                InputStream inputStream = file.getInputStream();
                String name = file.getOriginalFilename();
                systemOperLogWrite.systemLogWrite("    ", SystemOperLog.LOG_TYPE_INSERT, systemOperLogWrite.objectToString(name));
                //        
                String localMd5 = AliyunOSSClientUtil.getLocalMd5(file);
                AppVersionVo vo = new AppVersionVo();
                vo.setMd5(localMd5);
                List appVersionEntities = appVersionDubboService.findByVo(vo);
                if (CollectionUtils.isNotEmpty(appVersionEntities)) {
                    return ResultUtil.getFailResJson("      ", AcsConstent.BACK_FAILED_CODE);
                }
                String keyNeme = "";
                if (StringUtils.isBlank(name)) {
                    return ResultUtil.getFailResJson("       ");
                }
                if (name.endsWith(AcsConstent.APP.endWithName)) {
                    keyNeme = AcsConstent.APP.startFileName + StringUtils.getUUID() + AcsConstent.APP.endWithName;
                } else {
                    return ResultUtil.getFailResJson(AcsConstent.APP.uploaFileNameError, AcsConstent.BACK_FAILED_CODE);
                }
                long size = 1;
                if (file.getSize() > AcsConstent.INT_NUM_KB) {
                    size = file.getSize() / AcsConstent.INT_NUM_KB / AcsConstent.INT_NUM_KB;
                }
                // String bucketName = "aiot-face-image";
                SystemConfigEntity systemConfigField = systemConfigDubboService.getSystemConfigField(Constants.Aliyun_BucketName);
                String bucketName = systemConfigField.getValue();
                // Endpoint     ,  Region        
                // String endpoint = "http://oss-cn-shenzhen.aliyuncs.com";
                SystemConfigEntity systemConfigField1 = systemConfigDubboService.getSystemConfigField(Constants.Aliyun_Endpoint);
                String endpoint = systemConfigField1.getValue();
                SystemConfigEntity accessKey = systemConfigDubboService.getSystemConfigField(Constants.Aliyun_AccessKeyId);
                String accessKeyId = accessKey.getValue();
                SystemConfigEntity accessSecret = systemConfigDubboService.getSystemConfigField(Constants.Aliyun_AccessKeySecret);
                String accessKeySecret = AESUtil.aesDecrypt(accessSecret.getValue(), AcsConstent.APP.AccessKeySecret_DecryptKey);
                //   OSSClient  
                OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
                //     
                ObjectMetadata metadata = new ObjectMetadata();
                //         
                metadata.setContentLength(inputStream.available());
                //    Object            
                metadata.setCacheControl("no-cache");
                //    Object   Header
                metadata.setHeader("Pragma", "no-cache");
                //    Object           
                metadata.setContentEncoding("utf-8");
                //    MIME,            ,           、        。           Key          
                //             application/octet-stream
                metadata.setContentType(AliyunOSSClientUtil.getContentType(name));
                //    Object       (  MINME             ,     ,     )
                PutObjectResult putResult = ossClient.putObject(bucketName, keyNeme, inputStream, metadata);
                String eTag = putResult.getETag();
                //   OSSClient
                ossClient.shutdown();
                Date expiration = new Date(System.currentTimeMillis() + AcsConstent.APP.EXPIRE_DAY);
                String url = ossClient.generatePresignedUrl(bucketName, keyNeme, expiration).toString();
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("url", url);
                jsonObject.put("MD5", eTag);
                jsonObject.put("appSize", size);
                return StringUtils.isNotBlank(url) ? ResultUtil.getSuccessResJson("data", jsonObject.toString()) : ResultUtil.getFailResJson("    ", "1");
            } catch (Exception e) {
                logger.info("      ###################{}", e);
            }
            return null;
        }

    3.2 APP-サーバ
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
        @ResponseBody
        public Map uploadApk(HttpServletRequest request) {
            FileOutputStream fileOutputStream = null;
            InputStream inputStream = null;
            try {
                MultipartHttpServletRequest fileRequest = (MultipartHttpServletRequest) request;
                MultipartFile file = fileRequest.getFile("file");
                inputStream = file.getInputStream();
                String fileName = file.getOriginalFilename();
    
                //        
                String localMd5 = AliyunOSSClientUtil.fileToMd5(file);
                JSONObject checkJson = checkPamams(localMd5, fileName);
                if (checkJson != null) {
                    return checkJson;
                }
                long size = 1;
                if (file.getSize() > AcsConstent.INT_NUM_KB) {
                    size = file.getSize() / AcsConstent.INT_NUM_KB / AcsConstent.INT_NUM_KB;
                }
    
                String downloadFileUrl = redisOperatorManager.getValue("upload.file.url", CommonConstants.SYSTEM_CONFIG_REDIS_INDEX, "http://%s:%s/acs-admin/system/fileManager/downloadFileByKey?key=%s");
                downloadFileUrl = String.format(downloadFileUrl, host, port, localMd5);
                String fileUploadPath = fileUploadBasePath + File.separator + "app";
                File fileUploadPathFile = new File(fileUploadPath);
                if (!fileUploadPathFile.exists()) {
                    fileUploadPathFile.mkdirs();
                }
                //     md5 
                String keyName = localMd5 + AcsConstent.APP.endWithName;
                String fileUploadFileName = fileUploadPath + File.separator + keyName;
                File fileUploadFile = new File(fileUploadFileName);
                if (!fileUploadFile.exists()) {
                    fileUploadFile.createNewFile();
                }
                fileOutputStream = new FileOutputStream(fileUploadFile);
                IOUtils.copy(inputStream, fileOutputStream);
    
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("url", downloadFileUrl);
                jsonObject.put("MD5", localMd5);
                jsonObject.put("appSize", size);
                jsonObject.put("originalFilename", fileName);
    
                FileUploadVo fileUploadVo = new FileUploadVo();
                fileUploadVo.setFilePath(fileUploadPath);
                fileUploadVo.setFileName(keyName);
                fileUploadVo.setMd5(localMd5);
                //  
                notifyFileUploadZk(fileUploadVo);
    
                systemOperLogWrite.systemLogWrite("    ", SystemOperLog.LOG_TYPE_INSERT, jsonObject.toJSONString());
                return ResultUtil.getSuccessResJson("data", jsonObject.toString());
            } catch (RuntimeException e){
                logger.info("       ###################{}", e);
            } catch (Exception e) {
                logger.info("      ###################{}", e);
            } finally {
                IOUtils.closeQuietly(fileOutputStream);
                IOUtils.closeQuietly(inputStream);
            }
            return ResultUtil.getFailResJson("    ", "1");
        }