本文会对整个接口的代码贴出来的:
pom依赖
<dependency>
<groupId>com.github.dadiyang</groupId>
<artifactId>jave</artifactId>
<version>1.0.5</version>
</dependency>
要用到的实体类:
@Data
public class FileUploadRespDto implements Serializable{/**
*
*/
private static final long serialVersionUID = -1027809658897908756L;
@ApiModelProperty(value = "文件虚拟地址")
private String relativePath;
/**
* 第一个文件缩略图或视频截图虚拟地址
*/
@ApiModelProperty(value = "文件缩略图虚拟地址")
private String thumbPath;
/**
* 文件真实名称
*/
@ApiModelProperty(value = "文件原始文件名")
private String originalFileName;
@ApiModelProperty(value = "文件存储的文件名")
private String realFileName;
/**
* 文件大小,单位:字节
*/
@ApiModelProperty(value = "文件大小,单位:字节")
private Long fileSize;
/**
* 文件类型
*/
private String fileType;
}
@Data
public class FileUploadReqtDto implements Serializable {
private static final long serialVersionUID = 546925399464614774L;
/**
* spring的上传文件ServletRequest
*/
private MultipartHttpServletRequest multipartRequest;
}
@Getter
@Setter
@ApiModel(description = "上传文件的dto")
public class UploadFileVO implements Serializable {
private static final long serialVersionUID = -8817617589487164863L;
/**
* 文件后缀名
*/
@ApiModelProperty(value = "文件后缀名")
private String extName;
/**
* 上传的原始文件名
*/
@ApiModelProperty(value = "上传的原始文件名")
private String originalFileName;
/**
* 文件大小:单位字节
*/
@ApiModelProperty(value = "文件大小:单位字节")
private Long fileSize;
/**
* 文件类型
*/
@ApiModelProperty(value = "文件类型")
private String fileType;
/**
* 文件数据流
*/
@ApiModelProperty(value = "文件数据流")
private InputStream inputStream;
/**
* 文件数据输出的复制流
*/
@ApiModelProperty(value = "文件数据输出的复制流,不用传")
private ByteArrayOutputStream byteArrayOutputStream;
@Override
public String toString() {
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("上传的原始文件名:" + this.originalFileName + ",");
sBuilder.append("文件大小:" + this.fileSize + "字节,");
sBuilder.append("文件后缀名:" + this.extName);
sBuilder.append("文件类型:" + this.fileType);
return sBuilder.toString();
}
}
好了从cotroller层开始
@PostMapping("/videoToLoseWeight")
@ApiOperation(value = "视频减肥接口")
public ResponseBean<List<FileUploadRespDto>> uploads(HttpServletRequest request) throws Exception {
FileUploadReqtDto uploadReqtDto = new FileUploadReqtDto();
MultipartHttpServletRequest multipartRequest = null;
try {
multipartRequest = (MultipartHttpServletRequest)request;
} catch (Exception e) {
throw new BLogicException("文件格式不正确!");
}
uploadReqtDto.setMultipartRequest(multipartRequest);
return ResponseUtils.createRet(ResultCode.OK, fileUploadBLogic.uploads(uploadReqtDto));
}
}
接着service层
/**
* 视频减肥接口
* @param fileUploadReqtDto
* @return
* @throws Exception
*/
public List<FileUploadRespDto> uploads(FileUploadReqtDto fileUploadReqtDto) throws Exception {
MultipartHttpServletRequest multipartRequest = fileUploadReqtDto.getMultipartRequest();
Iterator<String> fileNames = multipartRequest.getFileNames();
String multipartContentType = multipartRequest.getMultipartContentType(fileNames.next());
List<MultipartFile> files = multipartRequest.getFiles(FILE);
List<FileUploadRespDto> results = new ArrayList<>();
for (MultipartFile mf : files) {
if (!mf.isEmpty()) {
UploadFileVO uploadFileVO = uploadFilehandle.getUploadFileVO(mf);
if (ObjectUtils.isNotEmpty(uploadFileVO)) {
FileUploadRespDto fileUploadRespDto = uploadVideos(uploadFileVO);
results.add(fileUploadRespDto);
}
}
}
return results;
}
/**
* 处理文件并上传
* @param uploadFileVO
* @return
* @throws IOException
*/
private FileUploadRespDto uploadVideos(UploadFileVO uploadFileVO) throws IOException {
log.info("视频减肥接口文件类型" + uploadFileVO.getFileType());
FileUploadRespDto uploadRespDto = new FileUploadRespDto();
String filePath = "src/main/resources/";
String UUID = StringUtils.getUUID();
String contextPath1 = filePath + uploadFileVO.getOriginalFileName() + "." + uploadFileVO.getExtName();
String contextPath2 = filePath + UUID + "." + "mp4";
//定义文件
File tempFile = null;
File f = null;
InputStream inputStream = null;
try {
tempFile = new File(contextPath1);
if (!tempFile.exists()) {
//生成文件
FileUtils.copyInputStreamToFile(uploadFileVO.getInputStream(), tempFile);
}
encode(contextPath1, contextPath2);
f = new File(contextPath2);
inputStream = new FileInputStream(f);
String fileName = UUID + "." + "mp4";
String url = aliyunOSSUploadService.upload(inputStream, fileName);
log.info("视频减肥接口relativePath:" + url);
uploadRespDto.setRelativePath(url);
uploadRespDto.setFileSize(f.exists()&&f.isFile()? Long.valueOf(Math.round((float)f.length()/1000)):null);
uploadRespDto.setOriginalFileName(uploadFileVO.getOriginalFileName());
uploadRespDto.setRealFileName(fileName);
uploadRespDto.setFileType(uploadFileVO.getFileType());
} catch (IOException e) {
throw new BLogicException("上传失败");
} finally {
//将临时文件删除
tempFile.delete();
f.delete();
inputStream.close();
}
return uploadRespDto;
}
/**
* 视频文件处理
* @param sources
* @param targets
*/
public static void encode(String sources, String targets) {
File source = new File(sources);
File target = new File(targets);
try {
// 音频编码设置
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(new Integer(56000));
audio.setChannels(new Integer(1));
audio.setSamplingRate(new Integer(22050));
// 视频编码设置
VideoAttributes video = new VideoAttributes();
video.setCodec("mpeg4");
video.setBitRate(new Integer(800000));
video.setFrameRate(new Integer(15));
video.setSize(new VideoSize(512, 384));
// 视频转码编码设置
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("mp4");
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(video);
// 编码器
Encoder encoder = new Encoder();
encoder.encode(source, target, attrs);
System.out.println("压缩完成...");
} catch (EncoderException e) {
e.printStackTrace();
}
}
aliyunOSSUploadService.upload(inputStream, fileName)是阿里云上传的方法。反参如图: