1.文件上传
1.介绍
- 文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
- 文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
2.前端的文件上传–form表单
- 将静态的页面资源放到static资源包下,upload.html文件代码如下
<form action="/upload" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="username"><br>
年龄: <input type="text" name="age"><br>
头像:<input type="file" name="image"><br>
<input type="submit" value="提交">
</form>
enctype="multipart/form-data"
:必须设置表单编码格式参数为multipart/form-data
,因为普通默认的编码格式不适合传输大型数据 。
关于enctype
的介绍:
3.服务端接收文件
- 建立Controller层的代码:
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upLoad(String username, Integer age, MultipartFile image) {
log.info("文件的上传,参数:{},{},{}", username, age, image);
return Result.success();
}
}
接收时的必要参数:
MultipartFile
(Java中提供的api接口) ,在接收参数时会产生一个临时文件,等待上传成功时候临时文件会自动的删除。
2.文件的存储
1.本地存储
- 在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。废话不说直接上代码(同样也是Controller层):
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upLoad(String username, Integer age, MultipartFile image) throws IOException {
log.info("文件的上传,参数:{},{},{}", username, age, image);
//获取文件原始名
String originalFilename = image.getOriginalFilename();
//构造唯一的文件名 uuid(通用唯一识别码--长度固定的字符串 de49685b-6lc0-4b11-80fa-c7le95924018)
int index = originalFilename.lastIndexOf(".");
String extName = originalFilename.substring(index);//获取后缀文件名
String newFileName= UUID.randomUUID().toString()+extName;
log.info("获取到的文件名:{}",newFileName);
//将文件存入指定的目录
image.transferTo(new File("D:\\resources\\" + newFileName));
return Result.success();
}
}
但是这种方式只能上传的文件大小只有1MB,超出之后就要配置一下
application.properties
文件:
#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小(一次请求可以上传多个文件,多个文件的总大小不能超过设置值)
spring.servlet.multipart.max-request-size=100MB
2.阿里云介绍
- 阿里云:阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商。
- 阿里云OSS
- 阿里云对象存储OSS (Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
- 第三方服务的通用思路
- 准备工作->参照官方SDK编写入门程序->集成使用
SDK:Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做
SDK
。
- 阿里云OSS–使用步骤
- 准备工作:注册阿里云(实名认证)->充值->开通对象存储服务(0SS)->创建bucket->获取AccessKey(秘钥)
Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。
- 参考阿里云文档进行快速入门
3.阿里云OSS集层开发–基于阿里云的云上传
- 步骤:
- (1)引入阿里云OSS上传文件工具类(由官方的示例代码改造而来),示例:
package com.mannor.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;
/**
* 阿里云 OSS 工具类
*/
@Component //交给了IOC容器管理--实现对此工具类进行操作
public class AliOSSUtils {
private String endpoint = "https://oss-cn-chengdu.aliyuncs.com";
private String accessKeyId = "yourAccessKeyId";
private String accessKeySecret = "yourAccessKeySecret";
private String bucketName = "mannor-tlias";
/**
* 实现上传图片到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的路径返回
}
}
- (2)上传图片接口开发,代码:
package com.mannor.Controller;
import com.mannor.pojo.Result;
import com.mannor.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@Slf4j
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils; //使用bean对象
@PostMapping("/upload")
public Result upLoad(MultipartFile image) throws IOException {
log.info("文件的上传,文件名:{}", image.getOriginalFilename());
String url = aliOSSUtils.upload(image); //返回值为文件的URL
log.info("文件上传完成,文件URl是:{}", url);
return Result.success(url);
}
}