文件上传
前端的代码:标红处必须是这样不可以更改
文件上传前端三要素:
1.post提交表单方式
2.编码格式enctype必须是muitipart/form-data,这种格式适合传输数据量大的二进制数据文件
3.类型必须是file类
1.编写静态页面,将静态资源放置在static下
本地存储
在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。
接口方法
@PostMapping("/upload")
public String upload(MultipartFile image) throws IOException {
//获取文件名
String originalFilename = image.getOriginalFilename();
//构造唯一文件名,确保后来上传的文件不会和之前上传的文件名重复,从而覆盖原来的文件
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileName = UUID.randomUUID().toString() + suffix;
//存储文件到本地磁盘
image.transferTo(new File("D:\\reggie_dish_img\\sky\\" + fileName));
return null;
}
在SpringBoot中,文件上传,默认单个文件允许最大大小为1M。如果需要上传大文件
可以进行如下配置:
#配置单个文件最大上传限制
spring.servlet.multipart.max-file-size=10MB
#配置单次请求最大上传限制
spring.servlet.multipart.max-request-size=100MB
云存储(AliOss)
使用阿里云云存储可以解决掉服务器本地存储的一些问题,比如:服务器磁盘满了,磁盘坏了等问题
1创建阿里云账号开通oss云服务
2.在Maven工程中使用OSS Java SDK,只需在pom.xml中加入相应依赖即可。
jdk9之前的版本:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</ artifactId><version>3.15.1</version>
< / dependency>
如果使用的是Java 9及以上的版本,则需要添加jaxb相关依赖。添加jaxb相关依赖示例代码如下:
<dependency>
<groupId>javax.xml. bind</groupId>
<artifactId>jaxb-api</ artifactId><version>2.3.1</version>
< / dependency>
<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>
3.阿里云工具类
/**
* 阿里云 OSS 工具类
*/
@Component
public class AliOSSUtils {
// @Value("${aliyun.oss.endpoint}")
// private String endpoint ;
// @Value("${aliyun.oss.accessKeyId}")
// private String accessKeyId ;
// @Value("${aliyun.oss.accessKeySecret}")
// private String accessKeySecret ;
// @Value("${aliyun.oss.bucketName}")
// private String bucketName ;
@Autowired
private AliOSSProperties aliOSSProperties;
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
//获取阿里云OSS参数
String endpoint = aliOSSProperties.getEndpoint();
String accessKeyId = aliOSSProperties.getAccessKeyId();
String accessKeySecret = aliOSSProperties.getAccessKeySecret();
String bucketName = aliOSSProperties.getBucketName();
// 获取上传的文件的输入流
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的路径返回
}
}
阿里云配置类
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
在配置文件中配置阿里云相关信息(将信息改成自己的)
4.定义阿里云文件上传接口方法
5.测试接口
上传本地文件后,会将文件上传到oss中,接口会将上传的url返回给前端,前端可以直接通过url对图片进行回显
文件下载 (本地存储)
前端向服务器请求回显图片(下载服务器的文件)
//文件的下载 将服务器上传的图片文件上传到浏览器(图片的回显)
@GetMapping("/download")
//name : 前端页面收到的后端发送的文件名 fileName
public void download(String name, HttpServletResponse response){
log.info(name);
try {
//输入流,通过输入流读取文件内容
FileInputStream fileInputStream =new FileInputStream(new File(basePath+name));
//输出流,通过输出流将文件写回浏览器,在浏览器显示图片
ServletOutputStream outputStream = response.getOutputStream();
//响应的是图片(固定格式)
response.setContentType("image/jpeg");
int len=0;
byte[] bytes=new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}