enctype="multipart/form-data"
:必须设置表单编码格式参数为multipart/form-data
,因为普通默认的编码格式不适合传输大型数据 。
关于enctype
的介绍:
@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接口) ,在接收参数时会产生一个临时文件,等待上传成功时候临时文件会自动的删除。
@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
SDK:Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做
SDK
。
Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。
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的路径返回
}
}
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);
}
}