springboot上传文件到阿里云

springboot上传文件到阿里云springboot上传文件到OSS前提声明,文章借鉴了https://blog.csdn.net/wonder_dog/article/details/81152307#commentsedit博客,大神在我没有思路的时候提供了最简洁明了的教程,话不多说:写代码吧1.首先依赖:<dependency><groupId>com.aliyun.oss&…

大家好,又见面了,我是你们的朋友全栈君。

springboot上传文件到OSS

前提声明,文章借鉴了https://blog.csdn.net/wonder_dog/article/details/81152307#commentsedit博客,

大神在我没有思路的时候提供了最简洁明了的教程,话不多说:写代码吧

1.首先依赖:

 <dependency>
     <groupId>com.aliyun.oss</groupId>
     <artifactId>aliyun-sdk-oss</artifactId>
     <version>${oss.version}</version>
</dependency>

2.配置oss必备属性,这都是阿里云要求的:

他有个桶机制与存入阿里云的必备条件,带着这些条件就能进行上传

aliyun:
  oss:
    access-id:   你的id
    access-key:  你的key
    bucket:      你的buket
    endpoint:    你的endpoint
    dir:         设置文件存放文件夹 随便写  上传自动生成
    expire:      失效时间

写完配置 你需要一个类进行接收,

这里用了idea的一个插件 lombk ,使用data注解 不写getset方法了

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties("aliyun.oss")
@Data
public class AliyunOssProperties { 
   
    private String accessId;
    private String accessKey;
    private String bucket;
    private String endpoint;
    private String dir;
    private Integer maxSize = Integer.valueOf(1);
    private Integer expire = Integer.valueOf(30);
    private boolean secure = false;
    private String roleSessionName;

    public AliyunOssProperties() { 
   
    }

    
}

上传工具类:(这里就不讲了,主要还是关于Controller层的讲解)

Controller层:
整体思路:

1.Springmvc帮我们接受前端传递过来的文件

2.获取文件名

3.自定义文件名(这里其实就可以通过/来控制上传到OSS里的文件路径了)

4.将MultpaertFile格式转化成JAVA的File格式

5.调用OSS工具类上传,除了一些基础的必备参数,还需要File属性的文件和我们自定义的上传路径(也可以理解为我们自定义的图片格式)

6.删除在本地服务器的文件副本

 /** logo文件上传*/
    @PostMapping("/uploadFile")
    public String uploadBlog(@RequestParam("file") MultipartFile file) { 
   
        //获取原始文件名
        String filename = file.getOriginalFilename();
		//判断文件是否为空
        try { 
   
            File toFile = null;
            if (file!=null) { 
   
                
                //拼接/log
                StringBuilder path = new StringBuilder("log/");
                //获取时间戳
                Date fileDate = new Date();
                StringBuilder fileName = new StringBuilder(String.valueOf(fileDate.getTime()));
                //获取时间文件夹,并且与时间戳进行拼接
                SimpleDateFormat dateFormatShow = new SimpleDateFormat("yyyyMMdd");
                String date = (dateFormatShow.format(new Date()));
                StringBuilder newName = new StringBuilder(date);
                //拼接/log/时间文件夹/时间戳
                path.append(newName.toString());
                path.append("/");
                path.append(fileName);



                //获取文件后缀名
                String filename3 = file.getOriginalFilename();
                String extName = filename3.substring(filename3.lastIndexOf(".") );
                path.append(extName);
                System.out.println(path);
               // 将前面拼接的路径与文件名后缀进行拼接
               // 获得类似这样的结果/log/20190517/1558074106768.png
                String yuming1 = path.toString();
									
               //将springmvc的MultipartFile类型转换成File类型
               //并且获取输出流将传进来的文件以流的方式写入我们新建的File类型文件
                File newFile = new File(filename);
                FileOutputStream os = new FileOutputStream(newFile);
                os.write(file.getBytes());
                //记得关流
                os.close();
               // file.transferTo(newFile);这是另一个方法,上面的是通过java流的方法,这个是springmvc的方法,效率更高

                // 调用阿里云的工具类上传到OSS
                
               //这个工具类只需要我们传参就好,而我们所需要的路径,就是域名+我们之前自定义的阿里云里的文件夹路径
                //所以这个工具类是不会返回url的,图片的访问地址就是域名+我们之前自定义拼接的阿里云的文件夹路径
              //网上还有其他工具类,封装的好,这里只是提供一种实现思路
                OSSUploadUtil.uploadFile(ali_endpoint,ali_accesskey_id,ali_accesskey_secret,ali_logstorage,newFile,yuming1);

              // 删除上传的文件,我们这种方法上传文件会在本地服务器留下一个文件副本,需要调用上传方法进行删除
                File file1=new File(filename);
                String s = file1.getAbsolutePath();
                DeleteFileUtil.delete(s);



  //http://你们公司跟阿里云申请的域名 拼接上我们之前自定义的文件上传路径 /log/20190517/1218209821212.jpg
                //拼接域名:
                StringBuilder yuming= new StringBuilder("http://阿里云发给你们公司的域名前缀/");
                //再拼接你自定义的文件存储路径
                yuming.append(yuming1);
                //这样返回给前端的就是直接能访问的url了
              return (yuming.toString());
            }
            return FALSE;
        }
            catch (Exception ex) { 
   
            ex.printStackTrace();
                return FALSE;
        }

     }
}

删除上传图片后存在本地服务器的图片的工具类:

/** * 删除文件和目录 * */
public class DeleteFileUtil { 
   

    /** * 删除文件,可以是文件或文件夹 * * @param fileName * 要删除的文件名 * @return 删除成功返回true,否则返回false */
    public static boolean delete(String fileName) { 
   
        File file = new File(fileName);
        if (!file.exists()) { 
   
            System.out.println("删除文件失败:" + fileName + "不存在!");
            return false;
        } else { 
   
            if (file.isFile())
                return deleteFile(fileName);
            else
                return deleteDirectory(fileName);
        }
    }

    /** * 删除单个文件 * * @param fileName * 要删除的文件的文件名 * @return 单个文件删除成功返回true,否则返回false */
    public static boolean deleteFile(String fileName) { 
   
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
        if (file.exists() && file.isFile()) { 
   
            if (file.delete()) { 
   
                System.out.println("删除单个文件" + fileName + "成功!");
                return true;
            } else { 
   
                System.out.println("删除单个文件" + fileName + "失败!");
                return false;
            }
        } else { 
   
            System.out.println("删除单个文件失败:" + fileName + "不存在!");
            return false;
        }
    }

    /** * 删除目录及目录下的文件 * * @param dir * 要删除的目录的文件路径 * @return 目录删除成功返回true,否则返回false */
    public static boolean deleteDirectory(String dir) { 
   
        // 如果dir不以文件分隔符结尾,自动添加文件分隔符
        if (!dir.endsWith(File.separator))
            dir = dir + File.separator;
        File dirFile = new File(dir);
        // 如果dir对应的文件不存在,或者不是一个目录,则退出
        if ((!dirFile.exists()) || (!dirFile.isDirectory())) { 
   
            System.out.println("删除目录失败:" + dir + "不存在!");
            return false;
        }
        boolean flag = true;
        // 删除文件夹中的所有文件包括子目录
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) { 
   
            // 删除子文件
            if (files[i].isFile()) { 
   
                flag = DeleteFileUtil.deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
            // 删除子目录
            else if (files[i].isDirectory()) { 
   
                flag = DeleteFileUtil.deleteDirectory(files[i]
                        .getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag) { 
   
            System.out.println("删除目录失败!");
            return false;
        }
        // 删除当前目录
        if (dirFile.delete()) { 
   
            System.out.println("删除目录" + dir + "成功!");
            return true;
        } else { 
   
            return false;
        }
    }

    public static void main(String[] args) { 
   
// // 删除单个文件
// String file = "c:/test/test.txt";
// DeleteFileUtil.deleteFile(file);
// System.out.println();
        // 删除一个目录
        String dir = "D:/home/web/upload/upload/files";
        DeleteFileUtil.deleteDirectory(dir);
// System.out.println();
// // 删除文件
// dir = "c:/test/test0";
// DeleteFileUtil.delete(dir);

    }

}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133161.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python面试常见问题有哪些「建议收藏」

    python面试常见问题有哪些「建议收藏」python面试常见问题有:1、Python是如何被解释的;2、什么是PEP8;3、Python是怎样管理内存的;4、什么是Python装饰器;5、Python提供哪些内置类型等等。

  • 关于左右连接「建议收藏」

    关于左右连接「建议收藏」首先来看一下两张主要的表:persons表orders表现在我们希望列出所有的人,以及他们的定购。SELECTpersons.last_name,persons.first_name,orders.order_noFROMpersonsLEFTJOINordersONpersons.pid=orders.pidORDER

  • 网站接入微信扫码登录并获取用户基本信息(微信开放平台)

    网站接入微信扫码登录并获取用户基本信息(微信开放平台)现在的网站基本都接入微信登陆了,就好像下面这样的。只需要用微信扫一下二维码,这个网站就可以展示你的微信昵称和头像,免去注册账号和输入密码登录的步骤,还免去设置头像和昵称的步骤,所以是挺方便的。那么如何把自己的网站接入这个呢?首先咱们得先在微信开放平台注册账号并且创建一个网站应用,等待审核通过后就可以获得Appid和AppSecretbingqie并且还要设置回调域名,这个不多说。首…

  • Cover Letter实用指南

    Cover Letter实用指南1、什么是CoverLetter?指的是投稿信2、coverletter的内容主要包括那些?应该简述所投稿件的核心内容、主要发现和意义,拟投期刊,对稿件处理有无特殊要求等(如“nottoreview”list)。另外,请附上主要作者的中文姓名、通讯地址、电话、传真和e-mail地址。此外有的杂志要求推荐几位审稿人及其联系方式。以及谁已经阅读过该文(当然是牛人)。

  • python logging模块 日志 (详细解析)「建议收藏」

    python logging模块 日志 (详细解析)「建议收藏」目录1基本使用2将日志写入到文件2.3设置消息的等级2.4捕获traceback2.5多模块使用logging3通过JSON或者YAML文件配置logging模块3.1通过JSON文件配置3.2通过YAML文件配置1基本使用转自:Python常用模块大全(整理)-略微抖动-博客园配置logging基本的设置,然后在控制台输出日志,importlogginglogging.basicConfig(level=logg

  • 使用fiddler对手机APP进行抓包

    使用fiddler对手机APP进行抓包在做手机或移动端APP的接口测试时,需要从开发人员那里获取接口文档,接口文档应该包括完整的功能接口、接口请求方式、接口请求URL、接口请求参数、接口返回参数。如果当前项目没有接口文档,则可以使用fiddler对APP进行抓包确认。在手机上对APP进行操作,然后在Fiddler中可以抓取对应的网络交互信息(一个功能中可能设计多个接口的交互)。在抓取的信息中可以看到接口请求方式、接口请求URL、接口请

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号