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);

    }

}


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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 零基础学Java(4)字符串

    零基础学Java(4)字符串字符串从概念上讲,Java字符串就是Unicode字符序列。例如,字符串"Java\u2122"由5个Unicode字符J、a、v、a和™组成。Java没有内置的字符串类型,而是

    2022年7月29日
    3
  • mysql中字符串转数字「建议收藏」

    mysql中字符串转数字「建议收藏」mysql中字符串在进行计算或排序的时候转数字比如以字符串111为例,方法一:SELECTCAST(‘111’ASSIGNED);方法二:SELECTCONVERT(‘111’,SIGNED);或者SELECTCONVERT(‘111’,decimal(10,5));方法三:SELECT‘111’+0;…

    2022年5月30日
    43
  • html嵌入python代码(python做人脸识别)

    最近闲来无事,研究研究在安卓上跑Python。想起以前玩过的kivy技术,kivy[1]是一个跨平台的UI框架。当然对我们最有用的是,kivy可以把python代码打包成安卓App。但是由于安卓打包的工具链很长,包括androidsdk打包java代码、ndk编译python、编译各种python依赖包,经常花一整天从入门到放弃。这次使出认真研究的心态,终于找到一个解决方案,于是有了这篇文章:…

    2022年4月16日
    132
  • WindowsPhone统计图表控件 – 第三方控件visifire

    WindowsPhone统计图表控件 – 第三方控件visifire++++++++++++++++++++++++++++++++++++++++++本文系本站原创,欢迎转载!转载请注明出处:http://blog.csdn.net/mr_raptor/article/details/7230124++++++++++++++++++++++++++++++++++++++++++ Silverlight对于图形图像处理方面,从1.0时

    2022年7月21日
    9
  • Python数据类型有哪些,哪些是可变类型,哪些是不可变类型?

    Python数据类型有哪些,哪些是可变类型,哪些是不可变类型?Python数据类型有哪些,哪些是可变类型,哪些是不可变类型?类型:整数int字符串str浮点数float布尔型bool列表list字典dict集合set元组tuple可变类型:就是这个数据类型的值在不改变这一块内存空间,而去改变这个数据类型的值。1.列表2.字典3.集合不可变类型:当改变值得时候,会申请一块新的内存空间,不再是原来的那一块内存空间了。整数字符串浮点数布尔型元组…

    2022年6月10日
    31
  • 递归数列是什么_数列递归

    递归数列是什么_数列递归递归数列-递归数列    (recursivesequence):一种用归纳方法给定的数列。递归数列-举例    例如,等比数列可以用归纳方法来定义,先定义第一项a1的值(a1≠0),对于以后的项,用递推公式an+1=qan(q≠0,n=1,2,…)给出定义。一般地,递归数列的前k项a1,a2,…,ak为已知数,从第k+1项起,由某一递推公式a

    2022年9月11日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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