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