文件上传是指将本地图片,视频,音频等文件上传到服务器,供其它用户浏览或下载的过程
文件上传前端三要素 :
file表单项
post方式
multipart/from-data
服务端接收文件 : 用spring中的API : MultipartFile
要想文件名唯一 : 可以使用uuid技术
在SpringBoot中,文件上传,默认的单个文件最大允许最大大小为1M,如果需要上传大文件,可以在application.properties中进行如下配置:
- #配置单个文件最大上传大小
- spring.servlet.multipart.max-file-size=10MB
-
- #配置单个请求最大上传大小(一次请求可以上传多个文件)
- spring.servlet.multipart.max-request-size=100MB
文件的本地存储 :
image.transferTo(new File("pathname")); 本地存储 : 无法直接访问 , 磁盘空间限制 , 磁盘损坏
OSS :
为每一个文件都提供了一个访问路径,可以直接访问到该文件
在aliyun中存储文件;
准备工作
参照官方SDk编写入门程序
集成使用
注意 :
SDk :Software Development Kit的缩写,软件开发工具包,包括辅助软件开发工具包(jar包),代码示例等,都可以叫做SDk;
注册阿里云(实名认证)
充值
开通对象存储服务(OSS):
点击右上角的控制台。
将鼠标移至左上角三条横线处,在显示界面中单击对象存储OSS。
然后点击开通
创建bucket : 直接点击左上角的新建Bucket,然后其它不用改,取一个唯一的name,然后将读写权限改为公共读。
获取AccessKey : 注意保存AccessKey和Secret
参照官方SDk编写入门程序 : 点击右下角的SDk下载,然后在新出现的页面中点击SDk示例,参考官方文档照做即可,如java : copy相关语言文件上传的代码即可,如下 :
- import org.junit.jupiter.api.Test;
- import com.aliyun.oss.ClientException;
- import com.aliyun.oss.OSS;
- import com.aliyun.oss.OSSClientBuilder;
- import com.aliyun.oss.OSSException;
- import java.io.FileInputStream;
- import java.io.InputStream;
-
- public class AliOssTest {
-
- @Test
- public void testOss(){
- // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
- String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
- // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
- String accessKeyId = "---------------------";
- String accessKeySecret = "-----------------------";
- // 填写Bucket名称,例如examplebucket。
- String bucketName = "-----------";
- // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
- String objectName = "0001.jpg";
- // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
- // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
- String filePath= "C:\\Users\\Administrator\\Pictures\\Saved Pictures\\10.jpg";
-
- // 创建OSSClient实例。
- OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
-
- try {
- InputStream inputStream = new FileInputStream(filePath);
- // 创建PutObject请求。
- ossClient.putObject(bucketName, objectName, inputStream);
- } catch (OSSException oe) {
- System.out.println("Caught an OSSException, which means your request made it to OSS, "
- + "but was rejected with an error response for some reason.");
- System.out.println("Error Message:" + oe.getErrorMessage());
- System.out.println("Error Code:" + oe.getErrorCode());
- System.out.println("Request ID:" + oe.getRequestId());
- System.out.println("Host ID:" + oe.getHostId());
- } catch (Exception ce) {
- System.out.println("Caught an ClientException, which means the client encountered "
- + "a serious internal problem while trying to communicate with OSS, "
- + "such as not being able to access the network.");
- System.out.println("Error Message:" + ce.getMessage());
- } finally {
- if (ossClient != null) {
- ossClient.shutdown();
- }
- }
- }
- }
如果jdk在9以上,除了添加
-
com.aliyun.oss -
aliyun-sdk-oss -
3.15.1 -
还要添加 :
-
javax.xml.bind -
jaxb-api -
2.3.1 -
-
-
javax.activation -
activation -
1.1.1 -
-
-
-
org.glassfish.jaxb -
jaxb-runtime -
2.3.3 -
然后在相关代码中更改自己的相关信息(如 : endpoint , accessKeyId,accessKeySecret等);
最后运行程序,就可以在自己的Bucket中查看到上传的文件了;
案例集成OSS :
如在新增员工的过程中,要上传图片,那么服务器端先接收上传的图片,然后通过程序将图片用OSS来存储,然后获取OSS中存储好的文件的URl,最后返回URl给前端,然后前端自动将图片展示出来。
注意 :
Bucket : 存储空间是用户用于存储对象(Object,就是文件)的容器,所有对象都必须隶属于某个存储空间。
创建一个工具类 AliOSSUtils(将相关信息更改为自己的):
- package com.it.utils;
-
- import com.aliyun.oss.OSS;
- import com.aliyun.oss.OSSClientBuilder;
- import org.springframework.stereotype.Component;
- import org.springframework.web.multipart.MultipartFile;
- import java.io.*;
- import java.util.UUID;
-
-
- @Component
- public class AliOSSUtils{
-
- private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
- private String accessKeyId = "xxxxxxx";
- private String accessKeySecret = "xxxxxx";
- private String bucketName = "xxxxxxxxxx";
-
- /**
- * 实现上传图片到OSS
- */
- public String upload(MultipartFile file) throws IOException {
- // 获取上传的文件的输入流
- InputStream inputStream = file.getInputStream();
-
- // 避免文件覆盖
- String originalFilename = file.getOriginalFilename();
- String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
-
- //上传文件到 OSS
- OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
- ossClient.putObject(bucketName, fileName, inputStream);
-
- //文件访问路径
- String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
-
- // 关闭ossClient
- ossClient.shutdown();
- return url;// 把上传到oss的路径返回
- }
-
- }
然后在该接口中直接调用工具类中的方法即可 :
- @PostMapping("/upload")
- public Result upload(MultipartFile image) throws IOException {
- log.info("文件上传,文件名 : {}",image.getOriginalFilename());
-
- // 调用阿里云OSS工具类进行文件上传
- String url = aliOSSUtils.upload(image);
- log.info("文件上传完成,文件访问的url为 : {}",url);
-
- return Result.success(url);
- }