派生自 projectDept/qhighschool

Administrator
2022-12-06 92027c9960c8e4e8d84db11c2c422254a5b7d38c
华为云obs上传
16个文件已修改
1个文件已添加
509 ■■■■■ 已修改文件
src/main/java/com/qxueyou/scc/admin/classes/service/IClassLectureService.java 170 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/admin/progress/service/IDetailProgressService.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/admin/progress/service/IProgressService.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/admin/progress/service/impl/ProgressService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/admin/progress/service/impl/item/LectureProgressService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/admin/progress/service/impl/lecture/LectureCommonProgressService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/admin/progress/service/impl/lecture/LectureDocProgressService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/admin/progress/service/impl/lecture/LectureVideoProgressService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/controller/HweiYunOBSController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/media/model/MediaVideo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/sys/utils/AudioUtil.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/sys/utils/Image2Binary.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/sys/utils/VideoUtil.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/teach/res/service/HweiYunOBSService.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/teach/res/service/impl/FileService.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/teach/res/service/impl/HweiYunOBSServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/teach/res/service/impl/resitem/ResItemVideoService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/qxueyou/scc/admin/classes/service/IClassLectureService.java
@@ -13,98 +13,98 @@
public interface IClassLectureService {
    /**
     * 新增章节文件夹
     * 新增章节文件夹
     * 
     * @param parentChapterId
     *            父级章节文件夹id
     *            父级章节文件夹id
     * @param name
     *            文件夹名称
     * @return 上传结果:{"success":true,msg:"success",attrs:{"chapterId","90023afwe32300fee23"}},若成功,则返回ChapterId
     *            文件夹名称
     * @return 上传结果:{"success":true,msg:"success",attrs:{"chapterId","90023afwe32300fee23"}},若成功,则返回ChapterId
     */
    Result addChapter(String parentChapterId, String name);
    /**
     * 返回下级章节文件夹列表,如果
     * 返回下级章节文件夹列表,如果
     * 
     * @param classId
     *            班级id
     *            班级id
     * @param parentChapterId
     *            父级章节文件夹id
     * @return 返回章节列表
     *            父级章节文件夹id
     * @return 返回章节列表
     */
    List<SubjectProgressTreeV> getChapterTreeVList(String classId, String parentChapterId);
    /**
     * 课件列表搜索
     * 课件列表搜索
     * 
     * @param chapterId
     *            章节id
     *            章节id
     * @param keyword
     *            关键字
     *            关键字
     * @param pageSize
     *            页码
     *            页码
     * @param pageNum
     *            每页显示数据条数
     *            每页显示数据条数
     * @param type
     *            类型
     *            类型
     * @return
     */
    List<MyLectureV> listLectureV(String learnerId, String chapterId, String keyword, Integer pageSize, Integer pageNum,
            String type);
    /**
     * 修改章节文件夹
     * 修改章节文件夹
     * 
     * @param chapterId
     *            文件夹id
     *            文件夹id
     * @param name
     *            名称
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     *            名称
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     */
    Result updateChapter(String chapterId, String name);
    /**
     * 删除章节文件夹
     * 删除章节文件夹
     * 
     * @param chapterIds
     *            章节文件夹id数组
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     *            章节文件夹id数组
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     */
    Result deleteChapter(String[] chapterIds);
    /**
     * 新增课件
     * 新增课件
     * 
     * @param chapterId
     *            章节id
     *            章节id
     * @param resId
     *            资源id
     * @return 上传结果:{"success":true,msg:"success",attrs:{"chapterId","90023afwe32300fee23"}},若成功,则返回chapterId
     *            资源id
     * @return 上传结果:{"success":true,msg:"success",attrs:{"chapterId","90023afwe32300fee23"}},若成功,则返回chapterId
     */
    Result addClsLecture(String chapterId, String resId);
    /**
     * 修改课件
     * 修改课件
     * 
     * @param lectureId
     *            课件id
     *            课件id
     * @param resId
     *            资源id
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     *            资源id
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     */
    Result updateLecture(String lectureId, String resId);
    /**
     * 删除课件
     * 删除课件
     * 
     * @param lectureIds
     *            课件id数组
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     *            课件id数组
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     */
    Result deleteLecture(String[] lectureIds);
    /**
     * 课件学习进度提交
     * 课件学习进度提交
     * 
     * @param clsLectureId
     * @param from
@@ -114,76 +114,76 @@
    Result doStudy(String clsLectureId, Double from, Double to);
    /**
     * 复制课件
     * 复制课件
     * 
     * @param lectureId
     *            课件id
     *            课件id
     * @param destChapterId
     *            目标章节id
     *            目标章节id
     * @param name
     *            课件名称
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     *            课件名称
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     */
    Result doCopyLecture(String lectureId, String destChapterId, String name);
    /**
     * 移动课件
     * 移动课件
     * 
     * @param lectureId
     *            课件id
     *            课件id
     * @param destChapterId
     *            目标章节id
     *            目标章节id
     * @param name
     *            课件名称
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     *            课件名称
     * @return 上传结果:{"success":true,msg:"success",attrs:{}}
     */
    Result doMoveLecture(String lectureId, String destChapterId, String name);
    /**
     * 课件列表搜索
     * 课件列表搜索
     * 
     * @param chapterId
     *            章节id
     *            章节id
     * @param keyword
     *            关键字
     *            关键字
     * @param pageNo
     *            页码
     *            页码
     * @param pageNum
     *            每页显示数据条数
     *            每页显示数据条数
     * @param type
     *            类型
     *            类型
     * @return
     */
    List<ClsSubjectLecture> listLecture(String chapterId, String keyword, Integer pageNo, Integer pageNum, String type,
            String classId);
    /**
     * 课件列表
     * 课件列表
     * 
     * @param classId
     *            章节id
     *            章节id
     * @return
     */
    List<ClsSubjectLecture> listLecture(String classId);
    /**
     * 读取课件真实文件访问路径
     * 读取课件真实文件访问路径
     * 
     * @param lectureId
     *            课件id数组
     *            课件id数组
     * @param attribute
     *            课件附加属性
     * @return 上传结果:{"success":true,msg:"success",attrs:{"type":"",path:""}}
     *            课件附加属性
     * @return 上传结果:{"success":true,msg:"success",attrs:{"type":"",path:""}}
     */
    Result readLectureAccessPath(String lectureId, String attribute);
    /**
     * 通过id读取班级的课件对象
     * 通过id读取班级的课件对象
     */
    ClsSubjectLecture readClsLecture(String id);
    /**
     * 读取课件目录
     * 读取课件目录
     * 
     * @param chapterId
     * @return
@@ -191,58 +191,58 @@
    ClsSubjectChapter readChapter(String chapterId);
    /**
     * 课件列表大小
     * 课件列表大小
     * 
     * @param chapterId
     *            章节id
     *            章节id
     * @param keyword
     *            关键字
     *            关键字
     * @param type
     *            类型
     *            类型
     * @return
     */
    int listLectureCount(String chapterId, String keyword, String type);
    /**
     * 返回下级章节文件夹列表
     * 返回下级章节文件夹列表
     * 
     * @param classId
     *            班级id
     *            班级id
     * @param classId
     *            课程id
     *            课程id
     * @param parentChapterId
     *            父级章节文件夹id
     * @return 返回章节列表
     *            父级章节文件夹id
     * @return 返回章节列表
     */
    List<ClsSubjectChapter> getListChapter(String classId,String subjectId, String parentChapterId);
    /**
     * 返回下级章节文件夹列表,如果
     * 返回下级章节文件夹列表,如果
     * 
     * @param classId
     *            班级id
     *            班级id
     *  @param subjectId
     *            课程id
     *            课程id
     * @param parentChapterId
     *            父级章节文件夹id
     * @return 返回章节列表
     *            父级章节文件夹id
     * @return 返回章节列表
     */
    List<ClsSubjectChapter> doGetListChapter(String classId,String subjectId, String parentChapterId);
    /**
     * 把课程上的课件拷贝到班级课程
     * 把课程上的课件拷贝到班级课程
     * 
     * @param subjectId
     *            课程id
     *            课程id
     * @param classId
     *            班级id
     *            班级id
     * @return
     */
    Result doCopyLecturesToClass(String origSubjectId, String subjectId, String classId);
    
    
    /**
     * 清理所有的班级课件
     * 清理所有的班级课件
     * @param subjectId
     * @param classId
     * @return
@@ -250,7 +250,7 @@
    Result doClearLecturesToClass(String subjectId, String classId);
    
    /**
     * 根据课程查询课件
     * 根据课程查询课件
     * 
     * @param subjectId
     * @param type
@@ -260,7 +260,7 @@
    List<Map<String, Object>> listLectureBySubject(String subjectId, String type, String classId);
    
    /**
     * 查询班级内的课件和课程
     * 查询班级内的课件和课程
     * 
     * @param classId
     * @return
@@ -268,7 +268,7 @@
    Result listSubjectLecture(String classId, String sort, Pager pager);
    
    /**
     * 获取课程下的课件
     * 获取课程下的课件
     * 
     * @param subjectId
     * @param type
@@ -277,7 +277,7 @@
    public Map<String,Object> listLectureBySubjectOrderCreateTime(String subjectId, String classId, String sort, Pager pager);
    
    /**
     * 学员端获取课程下课件
     * 学员端获取课程下课件
     * 
     * @param subjectId
     * @param type
@@ -286,7 +286,7 @@
    public List<Map<String, Object>> listStuLectureBySubject(String subjectId, String classId);
    
    /**
     * 学员端获取课程下课件数量
     * 学员端获取课程下课件数量
     * 
     * @param subjectId
     * @param type
@@ -295,7 +295,7 @@
    public long stuLectureCountBySubject(String subjectId, String classId);
    
    /**
     * 获取章节下的课件
     * 获取章节下的课件
     * 
     * @param chapterLst
     * @param lectures
@@ -304,7 +304,7 @@
    public List<ClsSubjectChapter> getChapterLectures(List<ClsSubjectChapter> chapterLst, List<Map<String, Object>> lectures);
    
    /**
     * 获取文档页码
     * 获取文档页码
     * 
     * @param resItemId
     * @return
@@ -312,7 +312,7 @@
    public int readDocPageCount(String resItemId);
    
    /**
     * 公开课课件
     * 公开课课件
     * 
     * @param subjectId
     * @param classId
@@ -323,7 +323,7 @@
    public Map<String,Object> listOpenLectureBySubjectOrderCreateTime(String subjectId, String sort, Pager pager);
    
    /**
     * 课件按目录分类
     * 课件按目录分类
     * 
     * @param classId
     * @param subjectId
@@ -331,4 +331,4 @@
     * @return
     */
    public Result coursewareChapterList(String classId,String subjectId, String type);
}
}
src/main/java/com/qxueyou/scc/admin/progress/service/IDetailProgressService.java
@@ -5,18 +5,18 @@
public interface IDetailProgressService {
    /**
     * 新增学习记录
     * @param type 进度类型
     * @param targetId 学习目标id
     * @param learnerId 学习者id
     * @param start 学习开始位置
     * @param end 学习结束位置
     * 新增学习记录
     * @param type 进度类型
     * @param targetId 学习目标id
     * @param learnerId 学习者id
     * @param start 学习开始位置
     * @param end 学习结束位置
     * @return
     */
    Result addProgress(String targetId,String learnerId,int start,int end);
    /**
     * 返回进度类型
     * 返回进度类型
     * @return
     */
    String getType();
src/main/java/com/qxueyou/scc/admin/progress/service/IProgressService.java
@@ -9,43 +9,43 @@
public interface IProgressService {
    /**
     * 查询学习进度
     * 查询学习进度
     *
     * @return
     */
    List<Progress> query(String type, String learnerId, List<String> targetId);
    /**
     * 查询学习进度
     * 查询学习进度
     *
     * @return
     */
    List<Progress> query(String type, List<String> learnerId, String targetId);
    /**
     * 查询学习记录
     * 查询学习记录
     *
     * @param type
     *            进度类型
     *            进度类型
     * @param targetId
     *            学习目标id
     *            学习目标id
     * @param learnerId
     *            学习者id
     *            学习者id
     * @return
     */
    Progress query(String type, String targetId, String learnerId);
    /**
     * 新增学习记录
     * 新增学习记录
     *
     * @param type
     *            进度类型
     *            进度类型
     * @param targetId
     *            学习目标id
     *            学习目标id
     * @param start
     *            学习开始位置
     *            学习开始位置
     * @param end
     *            学习结束位置
     *            学习结束位置
     * @return
     */
    Result addProgress(String type, String targetId, int start, int end, String userId);
src/main/java/com/qxueyou/scc/admin/progress/service/impl/ProgressService.java
@@ -40,7 +40,7 @@
    ProgressDAO dao;
    /**
     * 各类型课件进度服务实现
     * 各类型课件进度服务实现
     */
    private Map<String, IDetailProgressService> resItemServiceMap = new HashMap<String, IDetailProgressService>(6);
@@ -119,7 +119,7 @@
            save(progress);
        } catch (Exception e) {
            log.error("保存异常", e);
            log.error("保存异常", e);
            return;
        }
src/main/java/com/qxueyou/scc/admin/progress/service/impl/item/LectureProgressService.java
@@ -24,7 +24,7 @@
    IClassLectureService lectureService;
    /**
     * 各类型课件进度服务实现
     * 各类型课件进度服务实现
     */
    private Map<String, IDetailProgressService> resItemServiceMap = new HashMap<String, IDetailProgressService>(6);
src/main/java/com/qxueyou/scc/admin/progress/service/impl/lecture/LectureCommonProgressService.java
@@ -57,7 +57,7 @@
            updateProgress(targetId, p, sum);
        }
        //保存学习记录明细
        //保存学习记录明细
        this.saveProgressDetail(start, end, targetId, p.getProgressId(), learnerId);
        classLectureService.updateLecturetime(targetId);
@@ -77,7 +77,7 @@
    }
    /**
     * 保存学习记录明细
     * 保存学习记录明细
     *
     * @param start
     * @param end
@@ -104,7 +104,7 @@
    }
    /**
     * 获取进度百分比
     * 获取进度百分比
     *
     * @param targetId
     * @param sum
src/main/java/com/qxueyou/scc/admin/progress/service/impl/lecture/LectureDocProgressService.java
@@ -25,7 +25,7 @@
    }
    /**
     * 获取进度百分比
     * 获取进度百分比
     *
     * @param targetId
     * @param sum
src/main/java/com/qxueyou/scc/admin/progress/service/impl/lecture/LectureVideoProgressService.java
@@ -25,7 +25,7 @@
    }
    /**
     * 获取进度百分比
     * 获取进度百分比
     *
     * @param targetId
     * @param sum
src/main/java/com/qxueyou/scc/controller/HweiYunOBSController.java
@@ -1,5 +1,5 @@
package com.qxueyou.scc.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ArrayUtil;
@@ -7,12 +7,14 @@
//import cn.hutool.core.io.FileUtil;
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.teach.res.service.HweiYunOBSService;
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;
@@ -21,7 +23,7 @@
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
/**
 * @ClassName: ObsController
 * @Description: OBS服务器Controller
@@ -30,12 +32,12 @@
 * @Version: 1.0
 */
@RestController
@RequestMapping({ "file" })// @RequestMapping("/file")
@RequestMapping("/file")// @RequestMapping("/file")
public class HweiYunOBSController {
    @Resource
    private HweiYunOBSService hweiYunOBSService;
    @RequestMapping(value = "upload", method = RequestMethod.POST)
    public Result save(@RequestParam(value = "file", required = false) MultipartFile file) {
@@ -45,11 +47,11 @@
//        if (FileUtil.isEmpty(file)) {
//            return new Result(false,"文件为空");
//        }
        final String test = hweiYunOBSService.fileUpload(file, file.getOriginalFilename());
        final List<FileMeta> test = hweiYunOBSService.fileUpload(file, file.getOriginalFilename());
//        return ResponseVO.ok("执行成功",test);
        return new Result(true,"success",test);
    }
    @RequestMapping(value = "delete", method = RequestMethod.POST)
    public Result delete(@RequestParam(value = "fileName", required = false)  String fileName) {
        if (StrUtil.isEmpty(fileName)) {
@@ -58,7 +60,7 @@
        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) {
@@ -68,8 +70,8 @@
        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)) {
@@ -104,4 +106,4 @@
            return new Result(false);
        }
    }
}
}
src/main/java/com/qxueyou/scc/media/model/MediaVideo.java
@@ -764,4 +764,4 @@
    public void setM3u8KeyPath(String m3u8KeyPath) {
        this.m3u8KeyPath = m3u8KeyPath;
    }
}
}
src/main/java/com/qxueyou/scc/sys/utils/AudioUtil.java
@@ -46,7 +46,9 @@
    public static Float getMp3Duration(String filePath){
        try {
            File mp3File = new File(filePath);
            File file = File.createTempFile("temp", ".mp3"); //创建临时文件
            Image2Binary.toBDFile(filePath,file.getCanonicalPath());
            File mp3File = new File(file.getPath());
            MP3File f = (MP3File) AudioFileIO.read(mp3File);
            MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();
            return Float.parseFloat(audioHeader.getTrackLength()+"");
src/main/java/com/qxueyou/scc/sys/utils/Image2Binary.java
New file
@@ -0,0 +1,128 @@
package com.qxueyou.scc.sys.utils;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Image2Binary
{
    private static Logger log = LoggerFactory.getLogger(Image2Binary.class);
    public static byte[] toByteArray(InputStream in) throws IOException {
        ByteArrayOutputStream out=new ByteArrayOutputStream();
        byte[] buffer=new byte[1024*4];
        int n=0;
        while ( (n=in.read(buffer)) !=-1) {
            out.write(buffer,0,n);
        }
        return out.toByteArray();
    }
    /**
     * 网络文件转换为byte二进制
     * @Title: toByteArray
     * @Description: TODO(这里用一句话描述这个方法的作用)
     * @param @param url
     * @param @return
     * @param @throws IOException    设定文件
     * @return byte[]    返回类型
     * @throws
     */
    public static byte[] toByteArray(String urlStr) throws IOException {
        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        DataInputStream in = new DataInputStream(conn.getInputStream());
        ByteArrayOutputStream out=new ByteArrayOutputStream();
        byte[] buffer=new byte[1024*4];
        int n=0;
        while ( (n=in.read(buffer)) !=-1) {
            out.write(buffer,0,n);
        }
        return out.toByteArray();
    }
    /**
     * @throws IOException
     * @throws MalformedURLException
     * 网络文件转换为本地文件
     * @Title: toByteArray
     * @Description: TODO(这里用一句话描述这个方法的作用)
     * @param @param url
     * @param @return
     * @param @throws IOException    设定文件
     * @return byte[]    返回类型
     * @throws
     */
    public static void toBDFile(String urlStr, String bdUrl) throws IOException,UnknownHostException{
        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        DataInputStream in = new DataInputStream(conn.getInputStream());
        byte[] data=toByteArray(in);
        in.close();
        FileOutputStream out=new FileOutputStream(bdUrl);
        out.write(data);
        out.close();
    }
    /**
     * 直接获取网络文件的md5值
     * @param urlStr
     * @return
     */
    public static String getMd5ByUrl(String urlStr){
        String md5 = null;
        try {
            URL url = new URL(urlStr);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            DataInputStream in = new DataInputStream(conn.getInputStream());
            md5 = DigestUtils.md5Hex(in);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return md5;
    }
    /**
     * 获取网络文件的输入流
     * @param urlStr
     * @return
     */
    public static InputStream getInputStreamByUrl(String urlStr){
        DataInputStream in = null;
        try {
            URL url = new URL(urlStr);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            in = new DataInputStream(conn.getInputStream());
        } catch (IOException e) {
            log.error("url转换输入流失败,错误信息{}",e.getMessage());
        }
        return in;
    }
    public static void main(String[] args)
    {
//        try {
//            toBDFile("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1496324940814&di=1d70e0de447be6547c372718b9b30ff6&imgtype=0&src=http%3A%2F%2Fimage.tianjimedia.com%2FuploadImages%2F2015%2F204%2F22%2FYMG9CAUWUM15.jpg","E://a.jpg");
//        } catch (IOException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
        String a = getMd5ByUrl("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1496324940814&di=1d70e0de447be6547c372718b9b30ff6&imgtype=0&src=http%3A%2F%2Fimage.tianjimedia.com%2FuploadImages%2F2015%2F204%2F22%2FYMG9CAUWUM15.jpg");
        System.out.println(a);
    }
}
src/main/java/com/qxueyou/scc/sys/utils/VideoUtil.java
@@ -2,6 +2,7 @@
import com.coremedia.iso.IsoFile;
import java.io.File;
import java.io.IOException;
@@ -15,11 +16,18 @@
     * @return 单位为毫秒
     */
    public static long getMp4Duration(String videoPath) throws IOException {
        IsoFile isoFile = new IsoFile(videoPath);
        long lengthInSeconds =
                isoFile.getMovieBox().getMovieHeaderBox().getDuration() /
                        isoFile.getMovieBox().getMovieHeaderBox().getTimescale();
        return lengthInSeconds;
        try {
            File file = File.createTempFile("temp", ".mp4"); //创建临时文件
            Image2Binary.toBDFile(videoPath,file.getCanonicalPath());
                    IsoFile isoFile = new IsoFile(file.getPath());
            long lengthInSeconds =
                    isoFile.getMovieBox().getMovieHeaderBox().getDuration() /
                            isoFile.getMovieBox().getMovieHeaderBox().getTimescale();
            return lengthInSeconds;
        }catch (Exception e){
            e.printStackTrace();
            return 0;
        }
    }
src/main/java/com/qxueyou/scc/teach/res/service/HweiYunOBSService.java
@@ -1,17 +1,19 @@
package com.qxueyou.scc.teach.res.service;
import com.obs.services.model.PutObjectResult;
import com.qxueyou.scc.base.model.FileMeta;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.List;
/**
 * @Description 华为云OBS服务接口
 * @author wuhuiju
 * @date 2022/12/2 17:01
 */
public interface HweiYunOBSService {
    /**
     * @Description 删除文件
     * @author wuhuiju
@@ -20,7 +22,7 @@
     * @return: boolean 执行结果
     */
    boolean delete(String objectKey);
    /**
     * @Description 批量删除文件
     * @author wuhuiju
@@ -29,7 +31,7 @@
     * @return: boolean 执行结果
     */
    boolean delete(List<String> objectKeys);
    /**
     * @Description 上传文件
     * @author wuhuiju
@@ -38,8 +40,8 @@
     * @param: objectKey 文件名称
     * @return: java.lang.String url访问路径
     */
    String fileUpload(MultipartFile uploadFile, String objectKey);
    List<FileMeta> fileUpload(MultipartFile uploadFile, String objectKey);
    /**
     * @Description 文件下载
     * @author wuhuiju
@@ -49,4 +51,3 @@
     */
    InputStream fileDownload(String objectKey);
}
src/main/java/com/qxueyou/scc/teach/res/service/impl/FileService.java
@@ -27,7 +27,7 @@
/**
 * 所有文件上传的操作,单独到文件上传工程后,后续业务操作需要下载文件调用的方法
 *
 *
 * @author xiadehu
 *
 */
@@ -96,7 +96,7 @@
    /**
     * 插入文件信息到数据库
     *
     *
     * @param name
     * @param fullPath
     *            全路径
@@ -106,7 +106,7 @@
     *            文件类型,非文件格式
     * @return
     */
    private ResFile insertFileToDB(String name, String fullPath, String relativePath, String type) {
    public ResFile insertFileToDB(String name, String fullPath, String relativePath, String type) {
        ResFile file = new ResFile();
@@ -127,10 +127,41 @@
        return file;
    }
    /**
     * 插入文件信息到数据库
     *
     * @param name
     * @param relativePath
     *            相对路径
     * @param type
     *            文件类型,非文件格式
     * @return
     */
    public ResFile insertFileToDBTwo(String name, Long Size, String relativePath, String type) {
        ResFile file = new ResFile();
        TraceUtils.setCreateTrace(file);
        file.setFileName(name);
        file.setFileFormat(QFileUtils.getFileFormat(name));
        file.setFileType(type);
        // TODO
        file.setMd5Hash(null);
        file.setPath(relativePath);
        file.setSize(Size);
        // TODO
        file.setTenantId(null);
        file.setDeleteFlag(false);
        save(file);
        return file;
    }
    /**
     * 获取文件类型
     *
     *
     * @param name
     * @return
     */
@@ -141,7 +172,7 @@
    /**
     * 获取文件目标路径
     *
     *
     * @param name
     * @return
     */
src/main/java/com/qxueyou/scc/teach/res/service/impl/HweiYunOBSServiceImpl.java
@@ -1,29 +1,31 @@
package com.qxueyou.scc.teach.res.service.impl;
//import com.example.study.springboot.background.service.HweiYunOBSService;
//import com.example.study.springboot.config.HweiOBSConfig;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.*;
import com.qxueyou.scc.base.model.FileMeta;
import com.qxueyou.scc.base.model.Result;
import com.qxueyou.scc.base.util.CollectionUtils;
import com.qxueyou.scc.base.util.QFileUtils;
import com.qxueyou.scc.base.util.UUIDUtils;
import com.qxueyou.scc.config.HweiOBSConfig;
import com.qxueyou.scc.teach.res.model.ResFile;
import com.qxueyou.scc.teach.res.service.HweiYunOBSService;
import com.qxueyou.scc.teach.res.service.IFileService;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.core.ApplicationPart;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
 * @ClassName: HweiYunOBSServiceImpl
@@ -39,6 +41,9 @@
    private final Logger log = LogManager.getLogger(HweiYunOBSServiceImpl.class);
    @Autowired
    private HweiOBSConfig hweiOBSConfig;
    @Autowired
    FileService fileService;
    public final static String FILE_TYPE_VIDEO = "video";
@@ -65,7 +70,7 @@
            "JPG", FILE_TYPE_IMG,"JPEG", FILE_TYPE_IMG, "GIF", FILE_TYPE_IMG, "BMP", FILE_TYPE_IMG, "PNG", FILE_TYPE_IMG
    );
    @Override
    public boolean delete(String objectKey) {
        ObsClient obsClient = null;
@@ -81,7 +86,7 @@
        }
        return true;
    }
    @Override
    public boolean delete(List<String> objectKeys) {
        ObsClient obsClient = null;
@@ -99,10 +104,12 @@
        }
        return false;
    }
    @Override
    public String fileUpload(MultipartFile uploadFile, String objectKey) {
    public List<FileMeta> fileUpload(MultipartFile uploadFile, String objectKey) {
        ObsClient obsClient = null;
        List<FileMeta> files = new ArrayList<FileMeta>(2);
        FileMeta fileMeta = null;
        try {
            String destPath = getDestPath(objectKey);
            String bucketName = hweiOBSConfig.getBucketName();
@@ -127,10 +134,18 @@
            // 设置对象访问权限为公共读
            request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
            PutObjectResult result = obsClient.putObject(request);
            fileMeta = new FileMeta();
            ResFile file = fileService.insertFileToDBTwo(objectKey, uploadFile.getSize(), result.getObjectUrl(), uploadFile.getContentType());
            fileMeta.setFileId(file.getFileId());
            fileMeta.setPath(result.getObjectUrl());
            fileMeta.setFileSize(uploadFile.getSize() / 1024 + "kb");
            fileMeta.setFileType(uploadFile.getContentType());
            fileMeta.setFileName(objectKey);
            files.add(fileMeta);
            // 读取该已上传对象的URL
            log.info("已上传对象的URL" + result.getObjectUrl());
            return result.getObjectUrl();
            return files;
//            return result.getObjectUrl();
        } catch (ObsException e) {
            log.error("obs上传失败", e);
        } catch (IOException e) {
@@ -182,4 +197,4 @@
        }
        return null;
    }
}
}
src/main/java/com/qxueyou/scc/teach/res/service/impl/resitem/ResItemVideoService.java
@@ -4,6 +4,8 @@
import java.io.File;
import java.util.Date;
import com.obs.services.ObsClient;
import com.obs.services.model.ObsObject;
import com.qxueyou.scc.sys.utils.VideoUtil;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
@@ -39,8 +41,6 @@
    @Autowired
    ICacheService cacheService;
    @Value("${scc.resRootPath}")
    String resRootPath;
    @Override
    public String add(String fileId, String name) {
@@ -52,7 +52,7 @@
            TraceUtils.setCreateTrace(resVideo);
        try {
            resVideo.setFileId(fileId);
            resVideo.setPlayTime((int) VideoUtil.getMp4Duration(resRootPath +"/"+ file.getPath()));
            resVideo.setPlayTime((int) VideoUtil.getMp4Duration(file.getPath()));
            resVideo.setName(name);
            resVideo.setMediaVideoId(mediaVideoId);
            resVideo.setStatus(ResItemVideo.STATUS_LINEUP);
@@ -83,7 +83,7 @@
        try {
            video.setDeleteFlag(false);
            video.setPlayTime((int) VideoUtil.getMp4Duration(resRootPath +"/"+ file.getPath()));
            video.setPlayTime((int) VideoUtil.getMp4Duration(file.getPath()));
            video.setName(file.getFileName());
            video.setOrigUrl(file.getPath());
            video.setStatus(MediaVideo.STATUS_LINEUP);