简单示例
前端页面三要素:
表单项type = "file",表单提交方式post,表单的enctype属性 multipart/form-data
前端代码示例:
<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>
后端代码示例:
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String username,Integer age,@RequestParam("image")MultipartFile file) {
return Result.success();
}
}
MultipartFile类的方法
String getOriginalFilename(); //获取原始文件名
void transferTo(File dest); //将接收的文件转存到磁盘文件中
long getSize(); //获取文件的大小,单位:字节
byte[] getBytes(); //获取文件内容的字节数组
InputStream getInputStream(); //获取接收到的文件内容的输入流
阿里云OSS
本地上传,客户端无法直接访问文件,如果本地硬盘满了,或者硬盘坏了,就导致数据丢失。而使用阿里云OSS上传不存在这些问题。
阿里云oss集成
1、引入依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
2、参数配置化
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
在oss属性类上加上@ConfigurationProperties("aliyun.oss")
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Component
@ConfigurationProperties("aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
yml配置文件加入(这里输入自己的阿里云oss密钥)
aliyun:
oss:
endpoint: ****
accessKeyId: ****
accessKeySecret: ****
bucketName: *****
3、编写上传文件类
最后是编写上传文件工具类,上传的文件名前加上了uuid(通用唯一识别码),保证文件名唯一。
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
@Component
public class AliOSSUtils {
@Autowired
private AliOSSProperties properties;
/**
* 实现上传图片到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(properties.getEndpoint(), properties.getAccessKeyId(), properties.getAccessKeySecret());
ossClient.putObject(properties.getBucketName(), fileName, inputStream);
//文件访问路径
String url = properties.getEndpoint().split("//")[0] + "//" + properties.getBucketName() + "." + properties.getEndpoint().split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
如果上传文件过大,可以yml文件设置单个文件或请求上传大小限制
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB