springboot上传文件到阿里云

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

    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值