文件上传功能

16 阅读2分钟

前端

我们要用一个form表单,前端页面三要素:

  1. 方法要用POST
  2. enctype设置为“multipart/form-data”,若不改则只提交文件名
  3. 内部一个type为file的input组件

POSTman

若用postman等软件来测试时:

  1. 方法要用POST
  2. Body中选择form-data
  3. 在key中选择file而不是txt,value中选择要上传的文件

后端

import org.springframework.web.multipart.MultipartFile

需要通过MultipartFile这个类接收:

  1. 在SpringBoot中,文件上传,默认单个文件允许最大大小为1M,可在配置文件中配置。
  2. spring.servlet.multipart.max-file-size=10MB #配置单个文件最大上传大小
  3. spring.servlet.multipart.max-request-size=100MB #配置单个请求最大上传大小(一次请求可以上传多个文件)
  4. 接收后会在本地存一份.temp的临时文件,当方法结束后会自动删除
  5. 该对象有两个变量:
    1. part:
      1. fileitem:具体文件
      2. location:临时文件地址
    2. filename:文件名

本地存储(业务不常用(但是免费))

首先介绍几个用的到的api:

  1. String getOriginalFilename(); 获取原始文件名
  2. void transferTo(File dest);//将接收的文件转存到磁盘文件中
  3. long getSize();//获取文件的大小,单位:字节
  4. byte[] getBytes();//获取文件内容的字节数组
  5. InputStream getinputStream();//获取接收到的文件内容的输入流

介绍一下流程:

  1. 后端接收到MultipartFile对象
  2. 取出文件名的后缀,拼接上UUID,防止文件覆盖问题
    1. String originalFilename = 文件对象.getOriginalFilename();
    2. int index = originalFilename.lastIndexOf(".");
    3. String extname = originalFilename.substring (index);
    4. String newFileName = UUID.randomUUID().toString() + extname;
  3. 存起来:文件对象.transferTo(new File("E:/images/"+newFileName));

OSS对象存储(以阿里云举例)

首先介绍一下几个概念:

  • Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。
  • SDK:软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等

介绍一下准备工作:

  1. 注册账号
  2. 开通OSS服务
  3. 创建bucket,将读写权限设置为公共读
  4. 在头像处创建AccessKey,此时拿到AccessKey ID和AccessKey Secret
  5. 参考官方文档,引入SDK
  6. 根据示例代码进行修改,执行后查看文件列表,若上传成功则说明绑定成功

这时候就可以把OSS集成到之前的功能中了

  1. 接收上传的图片

    1. 文件对象.getinputStream()获取其Input流
    2. 同上拿到newFileName
  2. 将图片存储起来(OSS)

     OSS ossClient = new OSSClientBuilder().bpuild(endpoint, accessKeyId, accessKeySecret)
     ossClient.putOķject(bucketName, fileName, inmputStream)
    
  3. 拼接图片访问的url并返回

注意:

其中第二步中endpoint, accessKeyId, accessKeySecret,bucketName最好配置在配置文件中

然后使用@Value("${key}")注解注入到变量中

或者是用配置@ConfigurationProperties类后用@Autowired注入到对象中

@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
    private String endpoint;
    private String
    accessKeyId;
    private String
    accessKeySecret;
    private String bucketName;
}