继上一篇博客所讲,为了实现教师上传课件到本课程专门的文件夹,以及学生查询某已选课程的课件时只能查看该课程的课件,原本规划可否在数据库中新建一张表,专门存放课件名称以及对应的课程id,每个都可以教师上传所有课件到指定的文件夹(昨天已经实现),但是某个教师在查询自己课程所对应的课件时,应该先根据courseId去数据库查询课件名称(注意:一个courseId可能对应多个课件名称!),然后该教师根据查询到的这些课件名去指定的文件夹中查询并显示课件。
有了思路之后便开始了建表,创建javabean,写mapper、service:
@Data
public class FileName {
private Integer id;
//课程id
private Integer courseId;
//课件名称
private String fileName;
//创建时间
private Timestamp createTime;
//删除标志:0未删除 1已删除
private Integer deleted;
private String createTimeStr;
//设置时间格式
public String getCreateTimeStr() {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(createTime==null){
return createTimeStr;
}
Date date=new Date(createTime.getTime());
return sdf.format(date);
}
}
public interface FileNameMapper {
/**
* 根据courseId查询fileName
*/
List<FileName> getFileNameByCourseId(FileName fileName);
}
注:只展示了关键代码!
<!--根据courseId查询fileName-->
<select id="getFileNameByCourseId" resultMap="FileName" parameterType="FileName" >
select file_name from course_file_name
where course_id =#{courseId} and deleted =0
</select>
</mapper>
public interface FileNameService {
/**
* 根据courseId查询fileName
*/
List<FileName> getFileNameByCourseId(Integer courseId);
}
@Service
public class FileNameServiceImpl implements FileNameService {
@Autowired
private FileNameMapper fileNameMapper;
/**
* 根据courseId查询fileName
*/
public List<FileName> getFileNameByCourseId(Integer courseId){
FileName fileName=new FileName();
fileName.setCourseId(courseId);
List<FileName> result=fileNameMapper.getFileNameByCourseId(fileName);
return result;
}
}
逻辑准备工作完成之后,开始考虑在controller中调用逻辑实现想要的功能。
教师开始上传课件:先指定一个根文件夹newloads
String courseName=courseService.getCourseNameById(courseId);
String realPath = servletContext.getRealPath("/newuploads");
然后将课件存放到这个文件夹,同时拿到课件名fileName和courseId,将其存放到数据库。
到此时,突然意识到这个做法实在是多此一举:简历数据库表的原因是因为没有想到更好的方法来有效区分不同教师不同课程的课件放在不同的文件夹下,但是尝试中发现了一个新的方法:
//在newuploads目录下新建一个courseName对应的文件夹
File filePath = new File(realPath,courseName);
//如果目录不存在,则创建该目录
if (!filePath.exists()) {
filePath.mkdir();
}
new File(path,name)可以做到昔年一个路径或文件,将name附加到path后面,mkdir方法可以实现新建文件夹!
这样就完全可以在每次上传课件的时候给将课件上传到对应的唯一文件夹中,不用再通过从数据库获取课件名称的方式侧面管理这个文件,同理,教师或学生查询课件的时候也要在request获得的路径上附加上courseName子路径!
上传课件源代码:
@RequestMapping(value = "fileUpload", method = RequestMethod.POST)
public String fileUpload(HttpServletRequest request, @RequestParam(value = "desc", required = false) String desc,
@RequestParam("photo") CommonsMultipartFile fileList[],Integer courseId) throws Exception {
ServletContext servletContext = request.getServletContext();
//获取服务器下的文件存放目录
//Integer courseId=4;
String courseName=courseService.getCourseNameById(courseId);
String realPath = servletContext.getRealPath("/newuploads");
//在newuploads目录下新建一个courseName对应的文件夹
File filePath = new File(realPath,courseName);
//如果目录不存在,则创建该目录
if (!filePath.exists()) {
filePath.mkdir();
}
System.out.println("课件上传至目录:"+filePath.getPath());
OutputStream out;
InputStream in;
for (CommonsMultipartFile file : fileList) {
if (file.getSize() == 0) {
continue;
}
String fileName=file.getOriginalFilename();
//同时将文件名称保存进数据库
//将文件写进新建的courseName文件夹下
out = new FileOutputStream(new File(filePath + "\\" + fileName));
in = file.getInputStream();
byte[] b = new byte[1024];
int c = 0;
while ((c = in.read(b)) != -1) {
out.write(b, 0, c);
out.flush();
}
out.close();
in.close();
}
return "redirect:/teacher/showMyTeachingCourses";
}
查看课件源代码:
/**
*课件列表的显示
*/
@RequestMapping(value = "/showFile")
public String showFile(HttpServletRequest request,Integer courseId,Model model){
ServletContext servletContext = request.getServletContext();
//根据courseId查询courseName
String courseName=courseService.getCourseNameById(courseId);
System.out.println("前端传来的courseId:"+courseId);
String path=servletContext.getRealPath("/newuploads/"+courseName);
//查询path路径下courseName文件夹下的文件
File[] fileList=new File(path).listFiles();
model.addAttribute("fileList", fileList);
return "/teacher/showFile";
}
下载课件源代码:
/*
* 下载课件
*/
//用ResponseEntity<byte[]> 返回值完成文件下载
@RequestMapping(value = "fileDownload")
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request, @RequestParam(value = "path") String path)
throws Exception {
byte[] body = null;
//lastIndexOf()指定字符串出现的位置
String fileName = path.substring(path.lastIndexOf("_") + 1); //从uuid_name.jpg中截取文件名
File file = new File(path);
InputStream in = new FileInputStream(file);
//available()方法用于计算输入流有多少字节可以读取
body = new byte[in.available()];
in.read(body);
HttpHeaders headers = new HttpHeaders();
fileName = new String(fileName.getBytes("gbk"), "iso8859-1");
headers.add("Content-Disposition", "attachment;filename=" + fileName);
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
in.close();
return response;
}
删除指定课件源代码:
/**
*删除指定的文件
*/
@RequestMapping(value="/deleteFile",method = {RequestMethod.POST})
public String deleteFileByName(@RequestParam(value = "path") String path){
//指定要删除的某个文件
String fileName=path.substring(path.lastIndexOf("_")+1);
//删除指定的文件
File file=new File(fileName);
//指定的路径是文件且不空
if(file.isFile() &&file.exists()){
Boolean result= file.delete();
System.out.println(result);
}
return "redirect:/teacher/showMyTeachingCourses";
}
至此,课件相关操作已经实现,也充分完善了我的项目。第一个基于ssm+shiro的项目《教务信息管理系统》可以就此告一段落了,开始新的学习项目!
2018.8.17 充实过好每一天!