• JAVA整合阿里云OSS实现文件上传功能


    引入maven

    <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </dependency>
            <!--阿里云oss-->
    
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>2.8.2</version>
            </dependency>

    阿里云oss上传工具类

    AliOssCloudUtil.java

    package com.test.cms.aliyunoss;
    
    import com.aliyun.oss.OSSClient;
    import com.aliyun.oss.model.*;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    import java.io.*;
    
    /**
     * 阿里云 OSS文件类
     */
    public class AliOssCloudUtil {
        Log log = LogFactory.getLog(AliOssCloudUtil.class);
        private String endpoint = "oss-cn-hangzhou.aliyuncs.com";

    //阿里云的accessKeyId
    private String accessKeyId = "LTAI4GBP";
      //阿里云的accessKeySecret
      private String accessKeySecret = "mwpBLG"; //空间 private String bucketName = "js"; //文件存储目录 private String filedir = "val/"; private OSSClient ossClient; public AliOssCloudUtil() { ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } public String getFiledir() { return this.filedir; } //自定义上传文件夹 public AliOssCloudUtil(String filedir) { this.filedir = filedir; ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 初始化 */ public void init() { ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 销毁 */ public void destory() { ossClient.shutdown(); } /** * 上传到OSS服务器 * * @param instream 文件流 * @param fileName 文件名称 包括后缀名 * @return 出错返回"" ,唯一MD5数字签名 */ public String uploadFile2OSS(InputStream instream, String fileName) { String ret = ""; // 判断bucket是否已经存在,不存在进行创建 if (!doesBucketExist()) { createBucket(); } 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); // 指定上传文件操作时是否覆盖同名Object。 // 不指定x-oss-forbid-overwrite时,默认覆盖同名Object。 // 指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。 // 指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。 objectMetadata.setHeader("x-oss-forbid-overwrite", "false"); String objectName = filedir + fileName; //上传文件 ossClient.putObject(bucketName, objectName, instream, objectMetadata); // 封装 url 路径 String url = "http://" + bucketName + "." + endpoint + "/" + objectName; System.out.println(objectName); ret = url; } catch (IOException e) { log.error(e.getMessage(), e); } finally { ossClient.shutdown(); try { if (instream != null) { instream.close(); } } catch (IOException e) { e.printStackTrace(); } } return ret; } /** * 判断文件是否存在。doesObjectExist还有一个参数isOnlyInOSS, * 如果为true则忽略302重定向或镜像;如果为false,则考虑302重定向或镜像。 * yourObjectName 表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 * * @return 存在返回true */ public boolean doesObjectExist(String objectName) { boolean exists = ossClient.doesObjectExist(bucketName, filedir + objectName); return exists; } /** * 判断Bucket是否存在 * * @return 存在返回true */ public boolean doesBucketExist() { boolean exists = ossClient.doesBucketExist(bucketName); return exists; } /** * 创建Bucket */ public void createBucket() { CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); // 设置bucket权限为公共读,默认是私有读写 createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); // 设置bucket存储类型为低频访问类型,默认是标准类型 createBucketRequest.setStorageClass(StorageClass.IA); boolean exists = ossClient.doesBucketExist(bucketName); if (!exists) { try { ossClient.createBucket(createBucketRequest); // 关闭client ossClient.shutdown(); } catch (Exception e) { log.error(e.getMessage()); } } } /** * Description: 判断OSS服务文件上传时文件的contentType * * @param FilenameExtension 文件后缀 * @return String */ public static String getcontentType(String FilenameExtension) { if ("bmp".equalsIgnoreCase(FilenameExtension)) { return "image/bmp"; } if ("gif".equalsIgnoreCase(FilenameExtension)) { return "image/gif"; } if ("jpeg".equalsIgnoreCase(FilenameExtension) || "jpg".equalsIgnoreCase(FilenameExtension) || "png".equalsIgnoreCase(FilenameExtension)) { return "image/jpeg"; } if ("html".equalsIgnoreCase(FilenameExtension)) { return "text/html"; } if ("txt".equalsIgnoreCase(FilenameExtension)) { return "text/plain"; } if ("vsd".equalsIgnoreCase(FilenameExtension)) { return "application/vnd.visio"; } if ("pptx".equalsIgnoreCase(FilenameExtension) || "ppt".equalsIgnoreCase(FilenameExtension)) { return "application/vnd.ms-powerpoint"; } if ("docx".equalsIgnoreCase(FilenameExtension) || "doc".equalsIgnoreCase(FilenameExtension)) { return "application/msword"; } if ("xml".equalsIgnoreCase(FilenameExtension)) { return "text/xml"; } return "image/jpeg"; } /** * @param fileName * @return * @Title: getInputStreamByFileUrl * @Description: 根据文件路径获取InputStream流 * @return: InputStream */ public InputStream getInputStreamByFileUrl(String fileName) { // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。 OSSObject ossObject = ossClient.getObject(bucketName, fileName); return ossObject.getObjectContent(); } }

    控制器类

    FileUploadController.java

    package com.test.cms.controller;
    
    import com.test.cms.aliyunoss.AliOssCloudUtil;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    import java.util.UUID;
    
    @RestController
    public class FileUploadController {
    
        /**
         * 文件上传
         * @param file
         * @return
         */
        @PostMapping("/file/upload")
        public String upload(@RequestParam("file") MultipartFile file) {
            String filename = file.getResource().getFilename();
            //这里文件名用了uuid 防止重复,可以根据自己的需要来写
            String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length());
            name = name.replace("-", "");
            InputStream inputStream = null;
            try {
                inputStream = file.getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("上传失败");
            }
            AliOssCloudUtil util = new AliOssCloudUtil();
            //上传成功返回完整路径的url
            String url = util.uploadFile2OSS(inputStream, name);
            return url;
        }
    
        /**
         * 判断文件是否存在
         * @param fileName  储存的文件名
         * @return
         */
        @GetMapping("/file/exists")
        public Boolean exists(String fileName) {
            AliOssCloudUtil util = new AliOssCloudUtil();
            Boolean bool = util.doesObjectExist(fileName);
            return bool;
        }
    
    
        /**
         * 下载oss对应文件
         * @param fileName 储存的文件名
         * @return
         */
        @PostMapping("/file/downLoad")
        public void downloadFile(String fileName, HttpServletResponse response) {
            try {
                AliOssCloudUtil ossClientUtil = new AliOssCloudUtil();
                InputStream is = ossClientUtil.getInputStreamByFileUrl(ossClientUtil.getFiledir() + fileName);
                // 配置文件下载
                response.setHeader("content-type", "application/octet-stream");
                response.setContentType("application/octet-stream");
                // 下载文件能正常显示中文
                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
                OutputStream os = response.getOutputStream();
                byte[] b = new byte[1024];
                int len = -1;
                while ((len = is.read(b)) != -1) {
                    os.write(b, 0, len);
                }
                is.close();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    AJAX请求MVC控制器跨域头问题
    HTTP 错误500.19 -Internal Server Error 错误代码 0x80070021
    C# 同一时间批量生成订单号不重复
    Unity书籍下载地址
    几种常见的设计模式
    C# web api 对象与JSON互转
    自动按参数首字母排序参数
    C# 3DES加密 解密
    C#大量数据导出Excel
    判断对象是数组
  • 原文地址:https://www.cnblogs.com/pxblog/p/13402120.html
Copyright © 2020-2023  润新知