package com.qxueyou.scc.controller;
|
|
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.io.IoUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.StrUtil;
|
|
//import cn.hutool.core.io.FileUtil;
|
import com.aliyun.oss.OSSException;
|
import com.obs.services.exception.ObsException;
|
import com.obs.services.model.PutObjectResult;
|
import com.qxueyou.scc.base.model.FileMeta;
|
import com.qxueyou.scc.base.model.Result;
|
import com.qxueyou.scc.base.util.ClientUtils;
|
import com.qxueyou.scc.teach.res.service.HweiYunOBSService;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
import org.springframework.util.ObjectUtils;
|
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.BufferedOutputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.net.URLEncoder;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* @ClassName: ObsController
|
* @Description: OBS服务器Controller
|
* @Author: wuhuiju
|
* @Date: 2021-12-21 15:20
|
* @Version: 1.0
|
*/
|
@RestController
|
@RequestMapping("/file")// @RequestMapping("/file")
|
public class HweiYunOBSController {
|
private final Logger log = LogManager.getLogger("FileController");
|
|
@Resource
|
private HweiYunOBSService hweiYunOBSService;
|
|
@RequestMapping(value = "upload", method = RequestMethod.POST)
|
public List<FileMeta> save(@RequestParam(value = "file", required = false) MultipartFile file) throws IOException {
|
|
if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) {
|
return null;
|
}
|
// if (FileUtil.isEmpty(file)) {
|
// return new Result(false,"文件为空");
|
// }
|
final List<FileMeta> test = hweiYunOBSService.fileUpload(file, file.getOriginalFilename());
|
// return ResponseVO.ok("执行成功",test);
|
return test;
|
}
|
|
/**
|
* 文件上传接口:为客户端提供多线程分片上传接口
|
* 返回状态值:200代表成功,500代表上传失败,205代表需重新尝试
|
*
|
* @param identifier 唯一id,需客户端保证唯一性,相同文件保证唯一即可,非MD5
|
* @return
|
* @TODO : 目前缺少对 各模块文件个数、文件格式、文件大小的上传控制,统一增加在configFileModule表里面即可实现 1 图片; 2 文档 3 视频 4 音频
|
*/
|
@RequestMapping(value = "/uploadChunk", headers = "content-type=multipart/*", method = RequestMethod.POST)
|
public @ResponseBody FileMeta doUploadPublic(MultipartFile file, HttpServletResponse response,
|
Integer chunkNumber, Integer totalChunks, long chunkSize, long totalSize, String identifier, String filename, Integer currentChunkSize) {
|
|
FileMeta fileMeta = new FileMeta();
|
try {
|
|
Result uploadResult = null;
|
|
uploadResult = hweiYunOBSService.uploadChunk(file.getInputStream(), identifier.concat(ClientUtils.getUserId()), chunkNumber, currentChunkSize, totalChunks, filename);
|
|
|
fileMeta.setFileId(uploadResult.getDataT("fileId"));
|
fileMeta.setPath(uploadResult.getDataT("path"));
|
|
if (!uploadResult.isSuccess()) {
|
response.setStatus(205);
|
}
|
|
} catch (OSSException e) {
|
response.setStatus(500);
|
log.error(e, e);
|
} catch (Exception e) {
|
log.error("上传模块解析出错:" + e.getMessage(), e);
|
response.setStatus(500);
|
}
|
|
fileMeta.setFileName(filename);
|
fileMeta.setFileSize(String.valueOf(totalSize));
|
fileMeta.setFileType(null);
|
|
return fileMeta;
|
}
|
|
/**
|
* 初始化分片上传任务
|
*
|
* @return
|
*/
|
@RequestMapping(value = "/uploadChunk/init", method = RequestMethod.POST)
|
public @ResponseBody
|
Result initUploadChunk(String identifier, String fileName,String md5) {
|
|
//如果MD5的对应文件存在则直接返回
|
// Result result = fileService.checkMd5(md5,fileName);
|
|
return hweiYunOBSService.initUploadChunk(identifier.concat(ClientUtils.getUserId()), fileName,md5);
|
|
}
|
|
@RequestMapping(value = "delete", method = RequestMethod.POST)
|
public Result delete(@RequestParam(value = "fileName", required = false) String fileName) {
|
if (StrUtil.isEmpty(fileName)) {
|
return new Result(false,"删除文件为空");
|
}
|
final boolean delete = hweiYunOBSService.delete(fileName);
|
return delete?new Result(true,"success"):new Result(false,"删除失败");
|
}
|
|
@RequestMapping(value = "deletes", method = RequestMethod.POST)
|
//@RequestParam 获取List,数组则不需要
|
public Result delete(@RequestParam("fileNames") List<String> fileNames) {
|
if (ArrayUtil.isEmpty(fileNames)) {
|
return new Result(false,"删除文件为空");
|
}
|
final boolean delete = hweiYunOBSService.delete(fileNames);
|
return delete?new Result(true,"success"):new Result(false,"删除失败");
|
}
|
|
|
@RequestMapping(value = "download", method = RequestMethod.POST)
|
public Result download(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "fileName", required = false) String fileName) {
|
if (StrUtil.isEmpty(fileName)) {
|
return new Result(false,"下载文件为空");
|
}
|
try (
|
InputStream inputStream = hweiYunOBSService.fileDownload(fileName);
|
BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream())){
|
if(inputStream == null) {
|
return new Result(false);
|
}
|
// 为防止 文件名出现乱码
|
final String userAgent = request.getHeader("USER-AGENT");
|
// IE浏览器
|
if (StrUtil.contains(userAgent, "MSIE")) {
|
fileName = URLEncoder.encode(fileName, "UTF-8");
|
} else {
|
// google,火狐浏览器
|
if (StrUtil.contains(userAgent, "Mozilla")) {
|
fileName = new String(fileName.getBytes(), "ISO8859-1");
|
} else {
|
// 其他浏览器
|
fileName = URLEncoder.encode(fileName, "UTF-8");
|
}
|
}
|
response.setContentType("application/x-download");
|
// 设置让浏览器弹出下载提示框,而不是直接在浏览器中打开
|
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
|
IoUtil.copy(inputStream, outputStream);
|
return null;
|
} catch (IOException | ObsException e) {
|
return new Result(false);
|
}
|
}
|
}
|