springboot文件上传至本地和微服务文件上传到阿里云

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_45042013/article/details/102674832

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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_45042013/article/details/102674832