写点什么

springboot 文件上传下载实战 ——文件上传,nginx 架构模型

用户头像
极客good
关注
发布于: 刚刚

public String upload(MultipartFile aaa, HttpSession session) throws IOException {


// 获取上传用户的 id


User user = (User) session.getAttribute("user");


// 获取文件的原始名称


String oldFileName = aaa.getOriginalFilename();


// 获取文件的拓展名


String extension = "." + FilenameUtils.getExtension(oldFileName);


// 生成新的文件名称


String newFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) +


UUID.randomUUID().toString().replace("-", "") + extension;


// 获取文件的大小


long size = aaa.getSize();


// 获取文件类型


String type = aaa.getContentType();


// 根据日期生成文件目录


// ResourceUtils.getURL("classpath:") 是获取当前文件的 resources 路径


String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static/files";


// 日期文件夹


String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());


String dateDirPath = realPath + "/" + date;


File dateDir = new File(dateDirPath);


if (!dateDir.exists()) dateDir.mkdirs();


// 处理文件上传


aaa.transferTo(new File(dateDir, newFileName));


// 将文件信息放入数据库


UserFile userFile = new UserFile();


userFile.setOldFileName(oldFileName).setNewFileName(newFileName).


setExt(extension).setSize(String.valueOf(size)).setType(type).


setPath("/files/" + date).setUserId(user.getId());


System.out.println(userFile);


userFileService.save(userFile);


return "redirect:/file/showAll";


}


[](


)文件上传测试




之前我们完成了展示所有文件功能,但是由于数据库中没有数据,因此显示的页面为空,现在我们利用文件上传功能往数据库中添加数据。



点击 选择文件,选择电脑上的任意文件,然后点击 上传文件


点击上传文件后页面自动再次跳到显示所有页面,此时可以看到页面上已经有数据了。



[](


)文件下载与在线打开


============================================================================


com.yusael.dao 包下:UserFileDAO.java 接口中增加一个方法:


// 根据 id 找到文件信息


UserFile findById(Integer id);


// 更新下载次数


void update(UserFile userFile);


resources/com/yusael/mapper 目录下:UserFileDAOMapper.xml 中增加代码:


<select id="findById" parameterType="Integer" resultType="UserFile">


select id,oldFileName,newFileName,ext,path,size,type,isImg,downcounts,uploadTime,userId


from t_files


where id = #{id}


</select>


<update id="update" parameterType="UserFile">


update t_files set downcounts = #{downcounts} where id = #{id}


</update>




com.yusael.service 包下:UserFileService.java 接口中增加方法:


UserFile findById(Integer id);


void update(UserFile userFile);


com.yusael.service 包下:UserFileServiceImpl.java 实现类中增加代码:


@Override


public UserFile findById(Intege


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


r id) {


return userFileDAO.findById(id);


}


@Override


public void update(UserFile userFile) {


userFileDAO.update(userFile);


}




[](


)文件下载、在线打开核心 UserFileController




com.yusael.controller 包下:UserFileController.java 中增加方法:


// 文件下载


@GetMapping("/download")


public void download(Integer id, String openStyle, HttpServletResponse response) throws IOException {


// attachement 是以附件形式下载, inline 是在线打开


openStyle = "inline".equals(openStyle) ? "inline" : "attachment";


// 获取文件信息


UserFile userFile = userFileService.findById(id);


if ("attachment".equals(openStyle)) {


// 更新下载次数


userFile.setDowncounts(userFile.getDowncounts() + 1); // 下载次数+1


userFileService.update(userFile);


}


// 根据 文件信息中文件名字 和 文件存储路径 获取文件真实路径


String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();


// 获取文件输入流


InputStream is = new FileInputStream(new File(realPath, userFile.getNewFileName()));


// 获取响应输出流


response.setHeader("content-disposition", openStyle + ";fileName=" + URLEncoder.encode(userFile.getOldFileName(), "UTF-8"));


ServletOutputStream os = response.getOutputStream();


// 文件拷贝


IOUtils.copy(is, os);


IOUtils.closeQuietly(is);


IOUtils.closeQuietly(os);


}


[](


)文件下载、在线打开测试




前面我们已经完成了文件的上传功能,经过上传了图片,现在数据库中已经有了几张图片信息,我们点击下载,可以跳出下载界面,并且文件的下载次数会 + 1。



点击在线打开,如果是图片格式的文件,则会直接打开,否则依旧是以附件的形式下载,但是不增加下次次数。



[](


)文件删除


=======================================================================


com.yusael.dao 包下:UserFileDAO.java 接口中增加一个方法:


// 删除数据库中的文件


void delete(Integer id);


resources/com/yusael/mapper 目录下:UserFileDAOMapper.xml 中增加代码:


<delete id="delete" parameterType="Integer">


delete from t_files


where id = #{id}


</delete>




com.yusael.service 包下:UserFileService.java 接口中增加方法:

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
springboot文件上传下载实战 ——文件上传,nginx架构模型