欢迎大家进群,一起探讨学习
微信公众号,每天给大家提供技术干货
博主技术平台地址
博主开源微服架构前后端分离技术博客项目源码地址,欢迎各位star
java对接七牛云上传(详细版)
1.获取七牛云密钥 (我这里有多个存储空间)
2.yml配置
# 七牛秘钥
oss:
qiniu:
accessKey: 4H6sKnYPJrlzlM0zW9VRksZm1aA52R6lQyDoH1m_
secretKey: BQQ-Yqkr3VL7X3_LCcoK-u6r2nhIAHBEy6qDdBBh
#图片名字
bucketPictureName: sunset-pictures
#图片外部访问拦截
domainPicture: http://qiniu-picture.xiyanyuanma.com/
#文件名字
bucketFileName: sunset-file
#文件外部访问拦截
domainFile: http://qiniu-file.xiyanyuanma.com/
3.maven依赖
<!-- https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
4.InitConfig
package com.xiyan.config;
import com.xiyan.constants.Constant;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* 加载配置
*
* @author bright
*/
@Component
@ConfigurationProperties(prefix = "oss.qiniu")
@Data
@RefreshScope
public class InitConfig {
/**
* AccessKey
*/
private String accessKey;
/**
* SecretKey
*/
private String secretKey;
/**
* 图片存储空间名
*/
private String bucketPictureName;
/**
* 图片外链
*/
private String domainPicture;
/**
* 文件存储空间名
*/
private String bucketFileName;
/**
* 文件外链
*/
private String domainFile;
@Bean
public void init() {
Constant.accessKey = this.accessKey;
Constant.secretKey = this.secretKey;
Constant.bucketPictureName = this.bucketPictureName;
Constant.domainPicture = this.domainPicture;
Constant.bucketFileName = this.bucketFileName;
Constant.domainFile = this.domainFile;
}
}
Constant类
package com.xiyan.constants;
/**
* Description: 常量类
*
* @version 1.0:
* @author: bright
* @date:Created in 2020/7/3
*/
public class Constant {
public static final String IMAGE = "image";
public static final String FILE = "file";
/**
* AccessKey
*/
public static String accessKey;
/**
* SecretKey
*/
public static String secretKey;
/**
* 图片存储空间名
*/
public static String bucketPictureName;
/**
* 图片外链
*/
public static String domainPicture;
/**
* 文件存储空间名
*/
public static String bucketFileName;
/**
* 文件外链
*/
public static String domainFile;
}
QiNiuUtil
package com.xiyan.util;
import com.google.gson.Gson;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.xiyan.constants.Constant;
import java.io.FileInputStream;
/**
* Description:
*
* @author: bright
* @date:Created in 2020/12/3 17:39
*/
public class QiNiuUtil {
/**
* 将图片上传到七牛云
*/
public String upload(FileInputStream file, String fileType) throws Exception {
// zone0华东区域,zone1是华北区域,zone2是华南区域
Configuration cfg = new Configuration(Region.region0());
UploadManager uploadManager = new UploadManager(cfg);
// 生成上传凭证,然后准备上传
Auth auth = Auth.create(Constant.accessKey, Constant.secretKey);
String upToken = null;
String path = null;
if (fileType.equals(Constant.IMAGE)) {
upToken = auth.uploadToken(Constant.bucketPictureName);
path = Constant.domainPicture;
} else if (fileType.equals(Constant.FILE)) {
upToken = auth.uploadToken(Constant.bucketFileName);
path = Constant.domainFile;
}
Response response = uploadManager.put(file, null, upToken, null, null);
// 解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
return path + putRet.key;
}
}
UploadService
package com.xiyan.service;
import com.xiyan.vo.BaseVO;
import org.springframework.web.multipart.MultipartFile;
/**
* Description:
*
* @author: bright
* @date:Created in 2020/12/3 17:02
*/
public interface UploadService {
/**
* 文件上传
*
* @param file
* @param fileType
* @return
* @throws Exception
*/
BaseVO upload(MultipartFile file, String fileType) throws Exception;
}
UploadServiceImpl
package com.xiyan.service.impl;
import com.xiyan.constants.Constant;
import com.xiyan.enumeration.ErrorCodeEnum;
import com.xiyan.service.UploadService;
import com.xiyan.util.QiNiuUtil;
import com.xiyan.vo.BaseVO;
import com.xiyan.vo.FileVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileInputStream;
/**
* Description:
*
* @author: bright
* @date:Created in 2020/12/3 17:05
*/
@Service
@Slf4j
public class UploadServiceImpl implements UploadService {
@Override
public BaseVO upload(MultipartFile file, String fileType) throws Exception {
String fileName = file.getOriginalFilename();
if (fileName == null) {
log.error("传入的文件名不能为空");
return new BaseVO(false, ErrorCodeEnum.E0804.getKey(), ErrorCodeEnum.E0804.getValue());
}
if (!this.validateFileName(fileName)) {
log.error("文件名应仅包含汉字、字母、数字、下划线和点号");
return new BaseVO(false, ErrorCodeEnum.E0805.getKey(), ErrorCodeEnum.E0805.getValue());
}
FileInputStream fileInputStream = (FileInputStream) file.getInputStream();
String url = "";
if (fileType.equals(Constant.IMAGE)) {
url = new QiNiuUtil().upload(fileInputStream, Constant.IMAGE);
} else if (fileType.equals(Constant.FILE)) {
url = new QiNiuUtil().upload(fileInputStream, Constant.FILE);
}
FileVO fileVO = new FileVO();
fileVO.setDownloadUrl(url);
return fileVO;
}
/**
* 验证文件名称:仅包含 汉字、字母、数字、下划线和点号
*
* @param fileName 文件名称
* @return 返回true表示符合要求
*/
private boolean validateFileName(String fileName) {
String regex = "^[a-zA-Z0-9_\\u4e00-\\u9fa5_\\.]+$";
return fileName.matches(regex);
}
}
UploadController
package com.xiyan.controller;
import com.xiyan.constants.Constant;
import com.xiyan.service.UploadService;
import com.xiyan.vo.BaseVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/**
* Description:
*
* @author: bright
* @date:Created in 2020/12/3 17:14
*/
@Api(tags = "文件集合")
@RestController
public class UploadController {
@Resource
private UploadService uploadService;
@ApiOperation(value = "上传文件接口")
@PostMapping(value = "/file/upload")
public BaseVO fileUpload(MultipartFile file) throws Exception {
return uploadService.upload(file, Constant.FILE);
}
@ApiOperation(value = "上传图片接口")
@PostMapping(value = "/image/upload")
public BaseVO ImageUpload(MultipartFile file) throws Exception {
return uploadService.upload(file, Constant.IMAGE);
}
}
BaseVO
package com.xiyan.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author bright
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "结果码")
private Boolean success = true;
@ApiModelProperty(value = "错误码")
private String errorCode;
@ApiModelProperty(value = "错误信息")
private String errorMsg;
}
FileVO
package com.xiyan.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* Description:
*
* @author: bright
* @date:Created in 2020/11/16 13:57
*/
@Data
public class FileVO extends BaseVO {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "文件路径")
private String downloadUrl;
}
测试
注意上传大文件nginx需要做如下配置
找到自己主机的nginx.conf配置文件,打开
在http{}中加入
#客户端文件上传的大小
client_max_body_size 500m;
#用于tomcat反向代理,解决nginx 504错误
proxy_connect_timeout 300; #单位秒
proxy_send_timeout 300; #单位秒
proxy_read_timeout 300; #单位秒
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
# ps:以timeout结尾配置项时间要配置大点
然后重启nginx