笔记
文件上传
-
文件上传是指将本地图片,视频,音频等文件上传到服务器,供其它用户浏览或下载的过程
-
文件上传前端三要素 :
-
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):
-
点击右上角的控制台。
-
将鼠标移至左上角三条横线处,在显示界面中单击对象存储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 { @Testpublic 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以上,除了添加
<groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency>
还要添加 :
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency><!-- no more than 2.3.3--><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version></dependency>
-
然后在相关代码中更改自己的相关信息(如 : 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("."));
//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClientossClient.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);}