Преглед изворни кода

oss文件上传代码提交

sunruiqi пре 2 година
родитељ
комит
6aaaaddd4a

+ 158 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/oss/controller/OssController.java

@@ -0,0 +1,158 @@
+package com.jeeplus.test.oss.controller;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.http.ProtocolType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
+import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
+import com.jeeplus.test.oss.service.OSSClientService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import liquibase.pro.packaged.S;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Api(tags ="oss")
+@RestController
+@RequestMapping(value = "/oss/oss")
+public class OssController {
+
+    private static final String DIRECTORY = "/attachment-file";
+
+    private static final String ALIYUNURL = "http://oss.gangwaninfo.com";
+
+    private static final String ALIYUNDOWNLOADURL = "";
+
+    @Value("${config.accessory.aliyun.bucketName}")
+    private String bucketName;
+
+    @Value("${config.accessory.aliyun.endpoint}")
+    private String endpoint;
+
+    @Autowired
+    private OSSClientService ossClientService;
+
+    /**
+     * 文件上传
+     * @param storeAs
+     * @param file
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation(value = "文件上传")
+    @PostMapping("/upload")
+    public ResponseEntity<String> upload(@RequestParam String storeAs, @RequestParam("file") MultipartFile file) throws Exception {
+        //取得上传文件
+        if (file != null && !file.isEmpty()) {
+            // 文件保存路径
+            String realPath =DIRECTORY.replace("/","")+"/"+storeAs+ossClientService.datePath()+"/"+ System.currentTimeMillis();
+            //文件原名称
+            String newName = file.getOriginalFilename();
+            ossClientService.uploadFile2OSS(file.getInputStream(),realPath,newName);
+            String filepath = ALIYUNURL + "/" + realPath + newName;
+            return ResponseEntity.ok (filepath);
+        }
+        return ResponseEntity.ok(null);
+    }
+
+    @GetMapping("/getAccess")
+    @ApiOperation(value = "文件上传(前端调用)")
+    public Map<Object, Object> getAccess() {
+        // 只有 RAM用户(子账号)才能调用 AssumeRole 接口
+        // 阿里云主账号的AccessKeys不能用于发起AssumeRole请求
+        // 请首先在RAM控制台创建一个RAM用户,并为这个用户创建AccessKeys
+        String accessKeyId =  "LTAI5tBBnQdpZapU28Ds89fb";
+        String accessKeySecret = "A37CuoALjoxCjPolzRm3ct5o8UHILF";
+        // RoleArn 需要在 RAM 控制台上获取
+        String roleArn = "acs:ram::1132186699724035:role/yf";
+        long durationSeconds = Long.parseLong("3600");
+        String policy = "{\n" +
+                "  \"Version\": \"1\",\n" +
+                "  \"Statement\": [\n" +
+                "    {\n" +
+                "      \"Effect\": \"Allow\",\n" +
+                "      \"Action\": [\n" +
+                "        \"oss:*\"\n" +
+                "      ],\n" +
+                "      \"Resource\": [\n" +
+                "        \"acs:oss:*:*:*\"\n" +
+                "      ],\n" +
+                "      \"Condition\": {}\n" +
+                "    }\n" +
+                "  ]\n" +
+                "}";
+        // RoleSessionName 是临时Token的会话名称,自己指定用于标识你的用户,主要用于审计,或者用于区分Token颁发给谁
+        // 但是注意RoleSessionName的长度和规则,不要有空格,只能有'-' '_' 字母和数字等字符
+        // 具体规则请参考API文档中的格式要求
+        String roleSessionName = "yf";
+        // 此处必须为 HTTPS
+        ProtocolType protocolType = ProtocolType.HTTPS;
+        try {
+            final AssumeRoleResponse stsResponse = assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName,
+                    policy, protocolType, durationSeconds);
+
+            Map<Object, Object> respMap = new HashMap<Object, Object>();
+            respMap.put("status", "200");
+            respMap.put("AccessKeyId", stsResponse.getCredentials().getAccessKeyId());
+            respMap.put("AccessKeySecret", stsResponse.getCredentials().getAccessKeySecret());
+            respMap.put("SecurityToken", stsResponse.getCredentials().getSecurityToken());
+            respMap.put("Expiration", stsResponse.getCredentials().getExpiration());
+            respMap.put("AliyunUrl",ALIYUNDOWNLOADURL);
+            respMap.put("Bucket", bucketName);
+            respMap.put("Endpoint", endpoint);
+            return respMap;
+        } catch (ClientException e) {
+            log.error("调用ali获取临时token报错,错误信息:" + e.getMessage());
+            Map<Object, Object> respMap = new HashMap<Object, Object>();
+            respMap.put("status", e.getErrCode());
+            respMap.put("AccessKeyId", "");
+            respMap.put("AccessKeySecret", "");
+            respMap.put("SecurityToken", "");
+            respMap.put("Expiration", "");
+            respMap.put("AliyunUrl", "");
+            respMap.put("Bucket", "");
+            respMap.put("Endpoint", "");
+            return respMap;
+        }
+    }
+
+    public static final String REGION_CN_HANGZHOU = "cn-hangzhou";
+    public static final String STS_API_VERSION = "2015-04-01";
+    protected AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret, String roleArn,
+                                            String roleSessionName, String policy, ProtocolType protocolType, long durationSeconds) throws ClientException
+    {
+        try {
+            // 创建一个 Aliyun Acs Client, 用于发起 OpenAPI 请求
+            IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, accessKeyId, accessKeySecret);
+            DefaultAcsClient client = new DefaultAcsClient(profile);
+            // 创建一个 AssumeRoleRequest 并设置请求参数
+            final AssumeRoleRequest request = new AssumeRoleRequest();
+            request.setVersion(STS_API_VERSION);
+            request.setMethod(MethodType.POST);
+            request.setProtocol(protocolType);
+            request.setRoleArn(roleArn);
+            request.setRoleSessionName(roleSessionName);
+            request.setPolicy(policy);
+            request.setDurationSeconds(durationSeconds);
+            // 发起请求,并得到response
+            final AssumeRoleResponse response = client.getAcsResponse(request);
+            return response;
+        } catch (ClientException e) {
+            throw e;
+        }
+    }
+}

+ 134 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/oss/service/OSSClientService.java

@@ -0,0 +1,134 @@
+package com.jeeplus.test.oss.service;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.PutObjectResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Calendar;
+import java.util.Date;
+
+@Slf4j
+@Service
+public class OSSClientService {
+
+    @Value("${config.accessory.aliyun.bucketName}")
+    private String bucketName;
+
+    @Value("${config.accessory.aliyun.endpoint}")
+    private String endpoint;
+
+    @Value("${config.accessory.aliyun.accessKeyId}")
+    private String accessKeyId;
+
+    @Value("${config.accessory.aliyun.accessKeySecret}")
+    private String accessKeySecret;
+
+    /**
+     * 上传到OSS服务器  如果同名文件会覆盖服务器上的
+     *
+     * @param fileName 文件名称 包括后缀名
+     * @return 出错返回"" ,唯一MD5数字签名
+     */
+    public String uploadFile2OSS(InputStream inStream, String fileDir, String fileName) {
+        //初始化OSSClient
+        OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
+        long start = System.currentTimeMillis();
+        //上传文件
+        PutObjectResult putResult = ossClient.putObject(bucketName, fileDir + fileName, inStream);
+        String ret = putResult.getETag();
+
+        try {
+            if (inStream != null) {
+                inStream.close();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        long end = System.currentTimeMillis();
+        log.info("上传文件到云服务器成功,文件名:{},耗时:{}ms",fileName,end-start);
+        return ret;
+    }
+
+    /**
+     * 获得url链接
+     *
+     * @param key
+     * @return
+     */
+    public String getUrl(String key) {
+        OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
+        // 设置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;
+    }
+
+    /**
+     * 文件下载
+     * @param key
+     * @param fileName
+     */
+    public byte[] downBytesByStream(String key, String fileName){
+        OSSClient ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
+        byte[] bytes = null;
+        BufferedInputStream in = null;
+        ByteArrayOutputStream outputStream = null;
+        log.info("开始从云服务器加载文件,文件名:{}",fileName);
+        try {
+            // 创建OSSClient实例
+            long start = System.currentTimeMillis();
+            OSSObject ossObject = ossClient.getObject(bucketName, key);
+            in = new BufferedInputStream(ossObject.getObjectContent());
+            outputStream = new ByteArrayOutputStream();
+            byte[] car=new byte[1024];
+            int L=0;
+            while((L=in.read(car))!=-1){
+                outputStream.write(car, 0,L);
+            }
+            bytes = outputStream.toByteArray();
+            long end = System.currentTimeMillis();
+            log.info("从云服务器加载文件成功,文件名:{},耗时:{}ms",fileName,end-start);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }finally {
+            if (in!=null){
+                try {
+                    in.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (outputStream!=null){
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return  bytes;
+    }
+
+    public String datePath(){
+        Calendar date = Calendar.getInstance();
+        String year = String.valueOf(date.get(Calendar.YEAR));
+        String month = String.valueOf(date.get(Calendar.MONTH)+1);
+        String day = String.valueOf(date.get(Calendar.DAY_OF_MONTH));
+        String path = "/"+year+"/"+month+"/"+day;
+        return path;
+    }
+}

+ 6 - 0
pom.xml

@@ -455,6 +455,12 @@
             <groupId>javax.validation</groupId>
             <artifactId>validation-api</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.6.0</version>
+        </dependency>
     </dependencies>