版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1、本地文件上传:
1.springboot中springmvc默认大小1M
2.nginx默认大小1M
3.网关默认大小1M
application.yml配置:
server:
port: 8082
spring:
application:
name: upload-service
servlet:
multipart:
max-file-size: 5MB #修改springboot下 springmvc上传文件大小限制
# 注册中心
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
instance:
ip-address: 127.0.0.1
prefer-ip-address: true
nginx配置:
# nginx上传文件的大小
client_max_body_size 5m;
server {
listen 80;
server_name api.leyou.com;
# 网关设置图片上传大小
location /api/upload {
rewrite "^/(.*)$" /zuul/$1;
}
location / {
proxy_pass http://leyou-gateway;
proxy_connect_timeout 600;
proxy_read_timeout 5000;
}
}
server {
listen 80;
server_name image.leyou.com;
location / {
#本地上传
root html;
}
}
service层代码:
/**
* 图片上传 业务层
*/
@Service
public class UploadService {
//文件上传的路径
private static final String IMAGE_PATH = "C:\\Java\\nginx-1.15.3\\html\\image-file";
//文件访问的路径
private static final String IMAGE_URL = "http://image.leyou.com/image-file/";
//允许的文件类型(mime类型,是浏览器识别的文件类型,在tomcat中可找到各种类型)
private static final List ALLOW_IMAGE_TYPE = Arrays.asList("image/jpeg");
/**
* 图片上传本地
* @param file
* @return
*/
public String localFileUpload(MultipartFile file) {
// 1.判断上传文件的类型是否匹配(不匹配则报异常)
if (ALLOW_IMAGE_TYPE.contains(file.getContentType())){
throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
}
// 2. 解析图片元素
BufferedImage bufferedImage = null;
try {
bufferedImage = ImageIO.read(file.getInputStream());
} catch (IOException e) {
throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
}
// 3.读取到图片是否为空
if (bufferedImage == null){
throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
}
// 4. 生成上传的文件名称
String imageName = UUID.randomUUID()+file.getOriginalFilename();
// 5. 得到上传文件的对象
File imagePathFile = new File(IMAGE_PATH);
// 6. 本地上传文件,上传到imagePathFile文件中,名称叫imageName
try {
file.transferTo(new File(imagePathFile,imageName));
} catch (IOException e) {
throw new LyException(ExceptionEnum.FILE_UPLOAD_ERROR);
}
// 7.返回路径名和文件名称
return IMAGE_URL+imageName;
}
}
controller控制器代码:
/**
* 图片上传 控制器
*/
@RestController
public class UploadController {
@Autowired
private UploadService uploadService;
/**
* 图片上传本地(nginx配置网关/api/upload路径)
* @param file
* @return
*/
@PostMapping("/image")
public ResponseEntity<String> localFileUpload(@RequestParam("file")MultipartFile file){
String imageUrl = uploadService.localFileUpload(file);
return ResponseEntity.ok(imageUrl);
}
}
2、上传到阿里云服务器:
官网文档web流程图:
导入jar包支持:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.4.2</version>
<scope>compile</scope>
</dependency>
application.yml配置:
# 图片上传服务器
ly:
oss:
accessKeyId: LTAI4Fd2VpKsDUa3MuH7sq
accessKeySecret: hU0f5OL9HjsQmP6tccFtFkifHZAh
host: http://baidu.com # 访问oss的域名,很重要bucket + endpoint
endpoint: oss-cn-beijing.aliyuncs.com # 服务的端点
dir: "" #保存到bucket的某个子目录
expireTime: 20 #过期时间,单位s
maxFileSize: 5242880 # 文件大小限制,这里5M
解析applicatin.yml中的配置信息类:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 图片上传OSS阿里云服务端的属性类
*/
@Data
@Component // 解析yml中的文件或者在启动类中加
@ConfigurationProperties("ly.oss")
public class OSSProperties {
private String accessKeyId;
private String accessKeySecret;
private String bucket; // 服务端的桶名称
private String host;
private String endpoint;
private String dir;
private long expireTime;
private long maxFileSize;
}
生成获取客户端签名:
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 图片上传 获取签名的客户端
*/
@Configuration
public class OSSConfig {
@Autowired
private OSSProperties prop;
@Bean
public OSS ossClient(){
return new OSSClientBuilder().build(prop.getEndpoint(),prop.getAccessKeyId(),prop.getAccessKeySecret());
}
}
service层代码:
/**
* 图片上传 业务层
*/
@Service
public class UploadService {
@Autowired
private OSSProperties prop;
@Autowired
private OSS client;
/**
* 图片上传至OSS服务端,阿里云(官方文档代码修改)
* @return
*/
public Map<String, Object> getOssSignature() {
try {
// 1.获取当前 过期时间
long expireTime = prop.getExpireTime();
long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
Date expiration = new Date(expireEndTime);
// 2. 设置文件大小和保存的目录
PolicyConditions policyConds = new PolicyConditions();
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, prop.getMaxFileSize());
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, prop.getDir());
// 3. 将上面对象放入客户端
String postPolicy = client.generatePostPolicy(expiration, policyConds);
// 4.设置客户端字符编码
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
// 5. 生成客户端签名
String postSignature = client.calculatePostSignature(postPolicy);
// 6. 封装成map对象返回
Map<String, Object> respMap = new LinkedHashMap<String, Object>();
respMap.put("accessId", prop.getAccessKeyId());
respMap.put("policy", encodedPolicy); // 编码类型
respMap.put("signature", postSignature); // 客户端签名
respMap.put("dir", prop.getDir()); // 保存的目录
respMap.put("host", prop.getHost()); // 域名
respMap.put("expire", expireEndTime); // 过期时间
return respMap;
} catch (Exception e) {
throw new LyException(ExceptionEnum.FILE_UPLOAD_ERROR);
}
}
}
controller层 控制器
/**
* OSS上传服务端(获取签名)
*/
@GetMapping("/signature")
public ResponseEntity<Map<String,Object>> getOssSignature(){
Map<String,Object> map = uploadService.getOssSignature();
return ResponseEntity.ok(map);
}
nginx更改配置:
server {
listen 80;
server_name image.leyou.com;
location / {
#本地上传
# root html;
# 上传到阿里服务端
proxy_pass http://leyou-116.oss-cn-beijing.aliyuncs.com;
}
}