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)


相关推荐

  • 合格的程序员的基本素质

    中国有很多小朋友,他们18,9岁或21,2岁,通过自学也写了不少代码,他们有的代码写的很漂亮,一些技术细节相当出众,也很有钻研精神,但是他们被一些错误的认识和观点左右,缺乏对系统,对程序的整体理解能力

    2021年12月21日
  • futureTask用法

    futureTask用法futureTask用法深入学习FutureTask主要讲解了如何去使用futureTask来创建多线程任务,并获取任务的结果。Callable接口:实现这个接口的类,可以在这个类中定义需要执行的方法和返回结果类型。MyTask.java类publicclassMyTaskimplementsCallable<Object>{p…

  • 如何把内网IP映射到公网IP

    如何把内网IP映射到公网IP 鸽子出品2017-12-0522:28:22我们讲了如何搭建网站,可是有很多小伙伴私信跟我说怎么映射,今天我就教大家如何把内网地址映射到公网!我们所需要的工具有: 内网IP(这个是品,也是必有的!) nat123(这是映射软件,百度上都能搜索到) 有些小伙伴会问: 这个软件是什么操作系统啊? 这个软件免费吗? 当然官网上有windows版…

  • 数仓建模—数据安全「建议收藏」

    数仓建模—数据安全「建议收藏」数据安全差分隐私差分隐私是用来防范差分攻击的,差分隐私(英语:differentialprivacy)是密码学中的一种手段,旨在提供一种当从统计数据库查询时,最大化数据查询的准确性,同时最大限度减少识别其记录的机会比如有一群人出去聚餐,那么其中某人是否是单身狗就属于差分隐私。为了更形式化地描述差分隐私,我们需要先定义相邻数据集。现给定两个数据集D和D’,若它们有且仅有一条数据不一样,那我们就称此二者为相邻数据集。那么对于一个随机化算法(所谓随机化算法,是指对特定输入,该算法的输出不是固定值,而是服

  • Drupal 安装过程「建议收藏」

    Drupal 安装过程「建议收藏」php.ini文件https://drupal.stackexchange.com/questions/164172/problem-installing-in-local-the-translation-server-is-offlinecurl.cainfo=”C:\wamp64\keys\cacert.pem”转载于:https://www.cnblogs.com/A…

  • 计算机常用编码方式有哪些_计算机网络无分类编码

    计算机常用编码方式有哪些_计算机网络无分类编码计算机常用编码方式

    2022年10月29日

发表回复

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

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