parent
bb95bd444e
commit
58d8f0b1cb
18 changed files with 555 additions and 14 deletions
@ -0,0 +1,23 @@ |
|||||||
|
package com.teaching.backend.config; |
||||||
|
|
||||||
|
import org.springframework.core.io.FileSystemResource; |
||||||
|
import org.springframework.core.io.Resource; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author longge93 |
||||||
|
*/ |
||||||
|
@Component |
||||||
|
public class NonStaticResourceHttpRequestHandler extends ResourceHttpRequestHandler { |
||||||
|
|
||||||
|
public final static String ATTR_FILE = "NON-STATIC-FILE"; |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Resource getResource(HttpServletRequest request) { |
||||||
|
String filePath = (String) request.getAttribute(ATTR_FILE); |
||||||
|
return new FileSystemResource(filePath); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
package com.teaching.backend.controller.records; |
||||||
|
|
||||||
|
import com.teaching.backend.config.NonStaticResourceHttpRequestHandler; |
||||||
|
import org.mybatis.logging.Logger; |
||||||
|
import org.mybatis.logging.LoggerFactory; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.File; |
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
|
||||||
|
@RestController |
||||||
|
@RequestMapping(value = "/api/baseResource") |
||||||
|
public class BaseSourceApiController { |
||||||
|
|
||||||
|
|
||||||
|
@Autowired |
||||||
|
private NonStaticResourceHttpRequestHandler nonStaticResourceHttpRequestHandler; |
||||||
|
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(this.getClass()); |
||||||
|
|
||||||
|
@RequestMapping(value = "/video", method = RequestMethod.GET) |
||||||
|
public void video( |
||||||
|
HttpServletRequest request, |
||||||
|
HttpServletResponse response |
||||||
|
) { |
||||||
|
try { |
||||||
|
String path = "D:/Users/Desktop/image/剪映/7.18/7月20.mp4"; |
||||||
|
File file = new File(path); |
||||||
|
if (file.exists()) { |
||||||
|
request.setAttribute(NonStaticResourceHttpRequestHandler.ATTR_FILE, path); |
||||||
|
nonStaticResourceHttpRequestHandler.handleRequest(request, response); |
||||||
|
} else { |
||||||
|
response.setStatus(HttpServletResponse.SC_NOT_FOUND); |
||||||
|
response.setCharacterEncoding(StandardCharsets.UTF_8.toString()); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
package com.teaching.backend.controller.records; |
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestParam; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.OutputStream; |
||||||
|
|
||||||
|
@RestController |
||||||
|
@RequestMapping("/api/bf") |
||||||
|
public class Bf { |
||||||
|
/** |
||||||
|
* 根据本地图片全路径,响应给浏览器1个图片流 |
||||||
|
*/ |
||||||
|
@RequestMapping("/showImage") |
||||||
|
public void showImage(HttpServletResponse response, @RequestParam("fileName")String fileName) { |
||||||
|
System.out.println(fileName); |
||||||
|
show(response,fileName,"image"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据本地视频全路径,响应给浏览器1个视频 |
||||||
|
*/ |
||||||
|
@RequestMapping("/showVideo") |
||||||
|
public void showVideo(HttpServletResponse response, @RequestParam("fileName")String fileName) { |
||||||
|
show(response,fileName,"video"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 响应文件 |
||||||
|
* @param response |
||||||
|
* @param fileName 文件全路径 |
||||||
|
* @param type 响应流类型 |
||||||
|
*/ |
||||||
|
public void show(HttpServletResponse response, String fileName,String type){ |
||||||
|
try{ |
||||||
|
FileInputStream fis = new FileInputStream(fileName); // 以byte流的方式打开文件
|
||||||
|
int i=fis.available(); //得到文件大小
|
||||||
|
System.out.println(i); |
||||||
|
byte data[]=new byte[i]; |
||||||
|
fis.read(data); //读数据
|
||||||
|
response.setContentType(type+"/*"); //设置返回的文件类型
|
||||||
|
OutputStream toClient=response.getOutputStream(); //得到向客户端输出二进制数据的对象
|
||||||
|
toClient.write(data); //输出数据
|
||||||
|
toClient.flush(); |
||||||
|
toClient.close(); |
||||||
|
fis.close(); |
||||||
|
}catch(Exception e){ |
||||||
|
e.printStackTrace(); |
||||||
|
System.out.println("文件不存在"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
package com.teaching.backend.model.dto.upload; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class UploadFileParamsDto { |
||||||
|
/** |
||||||
|
* 文件名称 |
||||||
|
*/ |
||||||
|
private String filename; |
||||||
|
|
||||||
|
/** |
||||||
|
* 文件类型(文档,音频,视频) |
||||||
|
*/ |
||||||
|
private String fileType; |
||||||
|
/** |
||||||
|
* 文件大小 |
||||||
|
*/ |
||||||
|
private Long fileSize; |
||||||
|
/** |
||||||
|
* 标签 |
||||||
|
*/ |
||||||
|
private String tags; |
||||||
|
/** |
||||||
|
* 上传人 |
||||||
|
*/ |
||||||
|
private String username; |
||||||
|
/** |
||||||
|
* 备注 |
||||||
|
*/ |
||||||
|
private String remark; |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package com.teaching.backend.model.vo.records; |
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
@ApiModel(description = "知识点学习记录") |
||||||
|
public class KnowledgeLearningRecordVo { |
||||||
|
/** |
||||||
|
* 知识点学习id |
||||||
|
*/ |
||||||
|
private String id; |
||||||
|
/** |
||||||
|
* 课程id |
||||||
|
*/ |
||||||
|
private String coursesId; |
||||||
|
/** |
||||||
|
* 知识点id |
||||||
|
*/ |
||||||
|
private String knowledgeId; |
||||||
|
/** |
||||||
|
* 知识点名称 |
||||||
|
*/ |
||||||
|
private String knowledgeName; |
||||||
|
/** |
||||||
|
* 用户id |
||||||
|
*/ |
||||||
|
private String userId; |
||||||
|
/** |
||||||
|
* 学习人数 |
||||||
|
*/ |
||||||
|
private Integer number; |
||||||
|
/** |
||||||
|
* 学习时间 |
||||||
|
*/ |
||||||
|
private String time; |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
package com.teaching.backend.model.vo.records; |
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
@ApiModel(description = "资源学习记录") |
||||||
|
public class ResourceLearingRecordVo { |
||||||
|
/** |
||||||
|
* 资源学习id |
||||||
|
*/ |
||||||
|
private String id; |
||||||
|
/** |
||||||
|
* 资源名称 |
||||||
|
*/ |
||||||
|
private String resourceName; |
||||||
|
/** |
||||||
|
* 用户id |
||||||
|
*/ |
||||||
|
private String userId; |
||||||
|
/** |
||||||
|
* 学习人数 |
||||||
|
*/ |
||||||
|
private Integer number; |
||||||
|
/** |
||||||
|
* 学习时间 |
||||||
|
*/ |
||||||
|
private String time; |
||||||
|
} |
@ -0,0 +1,101 @@ |
|||||||
|
package com.teaching; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
import org.springframework.util.DigestUtils; |
||||||
|
|
||||||
|
import java.io.*; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.Comparator; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class MinioTest { |
||||||
|
//分块测试
|
||||||
|
@Test |
||||||
|
public void testChunk() throws IOException { |
||||||
|
//源文件
|
||||||
|
File sourseFile = new File("D:/Users/Desktop/image/剪映/7.18/7月20.mp4"); |
||||||
|
//分块文件存储路径
|
||||||
|
String chunkFilePath = "D:/Users/Desktop/image/剪映/7.18/chunk/"; |
||||||
|
//分块文件大小
|
||||||
|
int chunkSize = 1024 * 1024 * 1; |
||||||
|
//分块文件个数
|
||||||
|
int chunkNum = (int) Math.ceil(sourseFile.length() * 1.0 / chunkSize); |
||||||
|
//使用流从源文件读数据,向分块文件中写数据
|
||||||
|
RandomAccessFile raf_r = new RandomAccessFile(sourseFile, "r"); |
||||||
|
//缓存区
|
||||||
|
byte[] bytes = new byte[1024]; |
||||||
|
for (int i = 0; i < chunkNum; i++) { |
||||||
|
File chunkFile = new File(chunkFilePath + i); |
||||||
|
//分块文件写入流
|
||||||
|
RandomAccessFile raf_rw = new RandomAccessFile(chunkFile, "rw"); |
||||||
|
int len = -1; |
||||||
|
while((len=raf_r.read(bytes)) != -1){ |
||||||
|
raf_rw.write(bytes, 0, len); |
||||||
|
if (chunkFile.length() >= chunkSize){ |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
raf_rw.close(); |
||||||
|
} |
||||||
|
raf_r.close(); |
||||||
|
} |
||||||
|
|
||||||
|
//将分块进行合并
|
||||||
|
@Test |
||||||
|
public void testMerge() throws IOException { |
||||||
|
//块文件目录
|
||||||
|
File chunkFolder = new File("D:\\Users\\Desktop\\image\\剪映\\7.18\\chunk"); |
||||||
|
//源文件
|
||||||
|
File sourseFile = new File("D:/Users/Desktop/image/剪映/7.18/7月20.mp4"); |
||||||
|
//合并后的文件
|
||||||
|
File mergeFile = new File("D:/Users/Desktop/image/剪映/7.18/7月20_merge.mp4"); |
||||||
|
|
||||||
|
//取出所有分块文件
|
||||||
|
File[] files = chunkFolder.listFiles(); |
||||||
|
//将数组转成list
|
||||||
|
List<File> fileList = Arrays.asList(files); |
||||||
|
//对分块文件排序
|
||||||
|
Collections.sort(fileList, new Comparator<File>() { |
||||||
|
@Override |
||||||
|
public int compare(File o1, File o2) { |
||||||
|
return Integer.parseInt(o1.getName()) - Integer.parseInt(o2.getName()); //升序
|
||||||
|
} |
||||||
|
}); |
||||||
|
//向合并文件写的流
|
||||||
|
RandomAccessFile raf_rw = new RandomAccessFile(mergeFile, "rw"); |
||||||
|
//缓存区
|
||||||
|
byte[] bytes = new byte[1024]; |
||||||
|
//遍历分块文件,向合并的文件写
|
||||||
|
for (File file : fileList) { |
||||||
|
//读分块的流
|
||||||
|
RandomAccessFile raf_r = new RandomAccessFile(file, "r"); |
||||||
|
int len = -1; |
||||||
|
while((len = raf_r.read(bytes)) != -1){ |
||||||
|
raf_rw.write(bytes, 0, len); |
||||||
|
} |
||||||
|
raf_r.close(); |
||||||
|
} |
||||||
|
raf_rw.close(); |
||||||
|
//合并文件完成后对合并的文件校验
|
||||||
|
FileInputStream fileInputStream_merge = new FileInputStream(mergeFile); |
||||||
|
FileInputStream fileInputStream_source = new FileInputStream(sourseFile); |
||||||
|
String md5_merge = DigestUtils.md5DigestAsHex(fileInputStream_merge); |
||||||
|
String md5_source = DigestUtils.md5DigestAsHex(fileInputStream_source); |
||||||
|
if (md5_merge.equals(md5_source)){ |
||||||
|
System.out.println("文件合并成功!"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
//将分块文件上传到minio
|
||||||
|
public void uploadChunk(){ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
//调用minio接口合并分块
|
||||||
|
|
||||||
|
|
||||||
|
//批量清理分块文件
|
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue