方式一:oss实现文件上传:
1.导入对应的maven坐标
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
2. 配置文件
#服务名
spring:
application:
name: service-oss
#环境设置
profiles:
active: dev
server:
port: 8002
#阿里云OSS
aliyun:
oss:
file:
#不同的服务器,地址不同
endpoint: oss-cn-chengdu.aliyuncs.com
keyid: //注册阿里云oss功能获取
keysecret: //注册阿里云oss功能获取
#bucket:可以在控制台创建,也可以使用java代码创建
bucketname: edu-425
3.读取配置文件配置信息
package com.atguigu.oss.utils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Author panghl
* @Date 2020/12/31 21:36
* @Description 读取配置文件,常量类
**/
//当项目一启动,spring接口,spring加载之后,执行接口一个方法
@Component
public class ConstantPropertiesUtils implements InitializingBean {
//读取配置文件的内容
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
//定义公开静态常量
public static String END_POIND;
public static String KEY_ID;
public static String KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POIND = endpoint;
KEY_ID = keyId;
KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
4.controller
package com.atguigu.oss.controller;
import com.atguigu.common.R;
import com.atguigu.oss.service.OssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* @Author panghl
* @Date 2020/12/31 21:50
* @Description TODO
**/
@RestController
@RequestMapping("/eduoss/fileoss")
@CrossOrigin
public class OssController {
@Autowired
private OssService ossService;
//上传头像的方法
@PostMapping
public R uploadOssFile(MultipartFile file){
//获取上传文件
//返回上传到oss的路径
String url = null;
System.out.println(file);
try {
url = ossService.uploadFileAvatar(file);
} catch (IOException e) {
e.printStackTrace();
}
return R.ok().data("url",url);
}
/* private File getFile(String id, HttpServletResponse response){
EduTeacher eduTeacher = teacherService.get(id);
//点击下载链接更新下载次数
// Integer count= attach.getViewCount();
// count=count==null?0:count;
// count+=1;
// attach.setViewCount(count);
// attachService.updateById(attach);
*//* File file = getFile(id, response);
//获取文件输入流
FileInputStream is = new FileInputStream(file);
response.setContentType("application/octet-stream");
//获取响应输出流
ServletOutputStream os = response.getOutputStream();
//文件拷贝
IOUtils.copy(is, os);
IOUtils.closeQuietly(is);
try{
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
}catch (Exception ex){
ex.printStackTrace();
}*//*
File file=new File(eduTeacher.getAvatar());
return file;
}*/
}
5.service层
package com.atguigu.oss.service;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @Author panghl
* @Date 2020/12/31 21:50
* @Description OSS服务接口
**/
public interface OssService {
/**
* 上传头像
* @param file
* @return
*/
String uploadFileAvatar(MultipartFile file) throws IOException;
}
package com.atguigu.oss.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.atguigu.common.uuid.IdUtils;
import com.atguigu.oss.service.OssService;
import com.atguigu.oss.utils.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
/**
* @Author panghl
* @Date 2020/12/31 21:50
* @Description TODO
**/
@Service
public class OssServiceImpl implements OssService {
@Override
public String uploadFileAvatar(MultipartFile file) {
//工具类获取值
String endpoint = ConstantPropertiesUtils.END_POIND;
String accessKeyId = ConstantPropertiesUtils.KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.KEY_SECRET;
String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 获取上传文件输入流
InputStream inputStream = file.getInputStream();
//获取文件名称
String filename = file.getOriginalFilename();
//1.在文件名称里面添加随机唯一的值
//filename = IdUtils.fastSimpleUUID() + filename;
//2.把文件按照日期进行分类
// 2019/11/12/01.jpg 获取当前日期
//String datePath = new DateTime().toString("yyyy/MM/dd");
filename = new DateTime().toString("yyyy/MM/dd") + "/" + IdUtils.fastSimpleUUID() + filename;
//调用oss方法实现上传
//第一个参数 Bucket名称
//第二个参数 上传到oss文件路径和文件名称 /aa/bb/1.jpg
//第三个参数 上传文件输入流
// https://edu-425.oss-cn-chengdu.aliyuncs.com/testdlrb.jpg
ossClient.putObject(bucketName, filename, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传之后文件路径返回
//需要把上传到阿里云oss路径手动拼接出来
return "https://" + bucketName + "." + endpoint + "/" + filename;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
此时就已经可以实现文件的上传了!
这种实现方式需要在阿里云的对象存储 OSS开通服务!创建对应的Bucket仓库,通过AccessKey获取阿里云API的密钥
方式二:本地实现多文件上传:
1.配置配置信息
server:
port: 8003
edu:
file:
path: D:/file/
2.编写多文件对象
package com.atguigu.ftp.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.web.multipart.MultipartFile;
/**
* @Author panghl
* @Date 2021/1/8 16:11
* @Description TODO
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="多文件对象")
public class MultipartFilesBaseVO {
@ApiModelProperty(value = "附件列表",dataType = "MultipartFile")
@JsonIgnore
private MultipartFile[] files;
}
3.controller
package com.atguigu.ftp.controller;
import com.atguigu.common.R;
import com.atguigu.ftp.service.FileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @Author panghl
* @Date 2021/1/6 10:32
* @Description TODO
**/
@Api(tags = {"文件管理"})
@RestController
@RequestMapping("/edufile/local")
public class FileController {
@Autowired
private FileService fileService;
@ApiOperation(value = "單個文件上传")
@PostMapping(value = "/upload-file")
public R uploadFile(@RequestParam(value="file",required = true) MultipartFile file){
String url = fileService.uploadFile(file);
return R.ok().data("url",url);
}
@ApiOperation(value = "多文件MultipartFile上传")
// @ApiImplicitParams({@ApiImplicitParam(name = "file[]", value = "文件流对象,接收数组格式", required = true,paramType = "form",dataType = "file",allowMultiple = true)})
@ApiImplicitParams({@ApiImplicitParam(name = "file[]", value = "文件流对象,接收数组格式", required = true,dataType = "MultipartFile",allowMultiple = true)})
@PostMapping(value = "/upload-files")
public R uploadFile(@RequestParam(value="file[]",required = true) MultipartFile[] files){
List<String> urls = new ArrayList<>();
try {
urls = fileService.uploadFiles(files);
}catch (Exception e){
e.printStackTrace();
}
return R.ok().data("urls",urls);
}
}
4.service层
package com.atguigu.ftp.service;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @Author panghl
* @Date 2021/1/6 10:33
* @Version 1.0
* @Description TODO
**/
public interface FileService {
List<String> uploadFiles(MultipartFile[] files);
String uploadFile(MultipartFile file);
}
package com.atguigu.ftp.service.impl;
import com.atguigu.ftp.service.FileService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* @Author panghl
* @Date 2021/1/6 10:33
* @Description TODO
**/
@Service
public class FileServiceImpl implements FileService {
@Value("${edu.file.path}")
private String fileRootPath;
@Override
public List<String> uploadFiles(MultipartFile[] files) {
List<String> urls = new ArrayList<>();
int index = 0;
String filePath = "";
for (MultipartFile file : files) {
index += 1;
// 上传简单文件名
String originalFilename = file.getOriginalFilename();
String suffix = "";
if (originalFilename.lastIndexOf(".") >= 0) {
suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
}
// 存储路径
filePath = new StringBuilder(fileRootPath).append(System.currentTimeMillis() + "-" + index + "-" + UUID.randomUUID()).append(suffix).toString();
try {
// 保存文件
file.transferTo(new File(filePath));
urls.add(filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
return urls;
}
@Override
public String uploadFile(MultipartFile file) {
String filePath = "";
int index = 0;
// 上传简单文件名
String originalFilename = file.getOriginalFilename();
String suffix = "";
if (originalFilename.lastIndexOf(".") >= 0) {
suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
}
// 存储路径
filePath = new StringBuilder(fileRootPath).append(System.currentTimeMillis() + "-" + index + "-" + UUID.randomUUID()).append(suffix).toString();
try {
// 保存文件
file.transferTo(new File(filePath));
} catch (IOException e) {
e.printStackTrace();
}
return filePath;
}
}
5.使用swagger进行测试!
注意的是swagger的jar包是否冲突:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.22</version>
</dependency>
<!--swagger ui-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--swagger增强-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.2</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>