java 上传文件及预览_SpringBoot上传下载文件及在线预览

SpringBoot上传下载文件及在线预览

今天大概就说说如何使用SpringBoot进行上传和下载以及在线预览文件 本篇主要介绍上传下载的功能,对于界面就简单一点,大致如下:

一、老规矩还是先看看小项目的目录结构:

二、添加对应的pom依赖

org.springframework.boot

spring-boot-starter-thymeleaf

org.springframework.boot

spring-boot-starter-web

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.1.1

org.springframework.boot

spring-boot-devtools

runtime

true

mysql

mysql-connector-java

5.1.47

org.projectlombok

lombok

1.18.12

com.alibaba

druid

1.1.21

commons-fileupload

commons-fileupload

1.3.3

三、创建相应的配置

spring.application.name=files

server.port=8080

server.servlet.context-path=/files

spring.thymeleaf.cache=false

spring.thymeleaf.suffix=.html

spring.thymeleaf.encoding=UTF-8

spring.thymeleaf.prefix=classpath:/templates/

spring.resources.static-locations=classpath:/templates/,classpath:/static/,file:${upload.dir}

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/files?characterEncoding=UTF-8spring.datasource.username=root

spring.datasource.password=root

mybatis.mapper-locations=classpath:/com/baizhi/mapper/*.xml

mybatis.type-aliases-package=com.baizhi.entity

#控制台进行打印日志

logging.level.root=info

logging.level.com.baizhi.dao=debug

#上传和下载文件的路径

upload.dir=D:/idea_project/java/files/target/classes/static

四、先准备登陆界面的工作

1、创建实体类

@Data

@AllArgsConstructor

@NoArgsConstructor

@ToString

@Accessors(chain=true)

public class User {

private Integer id;

private String username;

private String password;

}

2、创建对应的dao层

public interface UserDAO {

User login(User user);

}

3、创建对应的mapper映射文件

select id,username,password

from t_user

where username=#{username}

and password = #{password}

4、创建业务层接口及实现类

public interface UserService {

User login(User user);

}

@Service

@Transactional

public class UserServciceImpl implements UserService{

@Autowired

private UserDAO userDAO;

@Override

@Transactional(propagation = Propagation.SUPPORTS)

public User login(User user) {

return userDAO.login(user);

}

}

5、创建控制器

@Controller

@RequestMapping("user")

@Slf4j

public class UserController {

@Autowired

private UserService userService;

/*** 登录方法*/

@PostMapping("login")

public String login(User user, HttpSession session){

User userDB = userService.login(user);

if(userDB!=null){

session.setAttribute("user",userDB);

return "redirect:/file/showAll";

}else{

return "redirect:/index";

}

}

}

6、创建登陆界面

用户登录

欢迎访问用户文件管理系统

username:

password:

7、查看运行后对应的界面

五、进行主界面的操作

1、创建实体类

@Data

@AllArgsConstructor

@NoArgsConstructor

@ToString

@Accessors(chain=true)

public class UserFile {

private Integer id;

private String oldFileName;

private String newFileName;

private String ext;

private String path;

private String size;

private String type;

private String isImg;

private Integer downcounts;

private Date uploadTime;

private Integer userId; //用户外键}

2、创建对应的dao层

public interface UserFileDAO {

//根据登录用户id获取用户的文件列表 List findByUserId(Integer id);

//保存用户的文件记录 void save(UserFile userFile);

//根据文件id获取文件信息 UserFile findById(String id);

//根据id更新下载次数 void update(UserFile userFile);

//根据id删除记录 void delete(String id);

}

3、创建dao层对应的mapper映射文件

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

from t_files

where userId=#{id}

insert into t_files

values (#{id},#{oldFileName},#{newFileName},

#{ext}, #{path},#{size},#{type},

#{isImg},#{downcounts}, #{uploadTime},#{userId})

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

from t_files

where id = #{id}

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

delete from t_files where id=#{id}

4、创建对应的业务层接口及实现类

public interface UserFileService {

List findByUserId(Integer id);

void save(UserFile userFile);

UserFile findById(String id);

void update(UserFile userFile);

void delete(String id);

}

@Service

@Transactional

public class UserFileServiceImpl implements UserFileService {

@Autowired

private UserFileDAO userFileDAO;

@Override

public List findByUserId(Integer id) {

return userFileDAO.findByUserId(id);

}

@Override

public void delete(String id) {

userFileDAO.delete(id);

}

@Override

public void update(UserFile userFile) {

userFileDAO.update(userFile);

}

@Override

public UserFile findById(String id) {

return userFileDAO.findById(id);

}

@Override

public void save(UserFile userFile) {

//userFile.setIsImg()? //是否是图片 解决方案: 当类型中含有image时说明当前类型一定为图片类型 String isImg = userFile.getType().startsWith("image")?"是":"否";

userFile.setIsImg(isImg);

userFile.setDowncounts(0);

userFile.setUploadTime(new Date());

userFileDAO.save(userFile);

}

}

5、创建控制器(重点)上传文件(且保存到i数据库中)

@PostMapping("upload")

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

//获取上传文件用户id User user = (User) session.getAttribute("user");

//获取文件原始名称 String oldFileName = aaa.getOriginalFilename();

//获取文件后缀 String extension = "." + FilenameUtils.getExtension(aaa.getOriginalFilename());

//生成新的文件名称 String newFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + UUID.randomUUID().toString().replace("-", "") + extension;

//文件大小 Long size = aaa.getSize();

//文件类型 String type = aaa.getContentType();

//处理根据日期生成目录 //String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static/files"; String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

String dateDirPath = uploadPath + "/files/" + dateFormat;

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/" + dateFormat).setUserId(user.getId());

userFileService.save(userFile);

return "redirect:/file/showAll";

}下载文件(在线预览)

@GetMapping("download")

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

//获取打开方式 openStyle = openStyle == null ? "attachment" : openStyle;

//获取文件信息 UserFile userFile = userFileService.findById(id);

//点击下载链接更新下载次数 if ("attachment".equals(openStyle)) {

userFile.setDowncounts(userFile.getDowncounts() + 1);

userFileService.update(userFile);

}

//根据文件信息中文件名字 和 文件存储路径获取文件输入流 String realpath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();

//获取文件输入流 FileInputStream 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);

}展示所有文件信息

@GetMapping("showAll")

public String findAll(HttpSession session, Model model) {

//在登录的session中获取用户的id User user = (User) session.getAttribute("user");

//根据用户id查询有的文件信息 List userFiles = userFileService.findByUserId(user.getId());

//存入作用域中 model.addAttribute("files", userFiles);

return "showAll";

}删除文件(及数据库中的)

@GetMapping("delete")

public String delete(String id) throws FileNotFoundException {

//根据id查询信息 UserFile userFile = userFileService.findById(id);

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

File file = new File(realPath, userFile.getNewFileName());

if(file.exists())file.delete();//立即删除

//删除数据库中记录 userFileService.delete(id);

return "redirect:/file/showAll";

}返回当前的文件列表(json格式数据)

@GetMapping("findAllJSON")

@ResponseBody

public List findAllJSON(HttpSession session, Model model) {

//在登录的session中获取用户的id User user = (User) session.getAttribute("user");

//根据用户id查询有的文件信息 List userFiles = userFileService.findByUserId(user.getId());

return userFiles;

}

6、创建对应的界面

用户文件列表页面

$(function(){

var time;

$("#start").click(function(){

console.log("开启定时更新.........");

time = setInterval(function () {

$.get("[[@{/file/findAllJSON}]]", function (res) {

//遍历 $.each(res, function (index, file) {

$("#" + file.id).text(file.downcounts);

})

});

}, 3000);

});

$("#stop").click(function () {

console.log("关闭定时更新");

clearInterval(time);

});

});

欢迎:

文件列表:

开启定时更新

结束定时更新

ID文件原始名称文件的新名称文件后缀存储路径文件大小类型是否是图片下载次数上传时间操作

下载

在线打开

删除


上传文件:

六、创建拦截器

public class LoginInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

HttpSession session = request.getSession();

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

if(user!=null) return true;

response.sendRedirect(request.getContextPath()+"/index");

return false;

}

}

七、创建过滤器

@Configuration

public class InterceptorConfig extends WebMvcConfigurationSupport {

@Value("${upload.dir}")

private String upload;

@Override

protected void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new LoginInterceptor())

.addPathPatterns("/file/**")

.excludePathPatterns("/css/**")

.excludePathPatterns("/js/**");//放行静态资源 静态资源被认为是一个控制器请求 }

@Override

protected void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/**") //代表以什么样的请求路径访问静态资源 .addResourceLocations("classpath:/static/")

.addResourceLocations("classpath:/templates/")

.addResourceLocations("file:"+upload);//本地资源路径必须放在最上面

}

}

八、进行测试初始化

上传后

下载

在线预览

删除 变为初始化的样子 有需要源码的可以联系我!

还是要说说我的个人博客,希望大家多多访问,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolov4用1050ti_简单粗暴的多目标跟踪神器 – DeepSort

目标跟踪问题一直是计算机视觉的热点任务之一,简单的可以分为单目标跟踪与多目标跟踪,最常见的目标跟踪算法都是基于检测的跟踪算法,首先发现然后标记,好的跟踪算法必须具备REID的能力。今天小编斗胆给大家推荐一个结合传统算法跟…

java 数据库语句_java连接各数据库的语句

1、Oracle8/8i/9i数据库(thin模式)Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();String url"jdbc:oracle:thin:localhost:1521:orcl";//orcl为数据库的SIDString user"test\";String password"test";Connection c…

alm数据库mysql_mysql

1. mysql启动mysqld --console2. mysql关闭mysqladmin shutdown -uroot -proot3. 免安装mysql配置:启动mysql: mysqld --skip-grant-tables(跳过安全校验), 修改mysql.user表里面的数据,最后flush privileges;mysql jdbc连接代码…

类java的步骤_java类加载的过程

类加载就是三个过程:加载、链接、初始化链接又可以分为验证、准备、解析1.加载将class字节码文件通过类加载器装入内存中2.验证确保当前class文件的字节流所包含的内容符合当前JVM的规范要求,并且不会出现危害JVM自身安全的代码,当前字节流不…

java拓展接口_Java拓展接口-default关键词

Java接口在使用过程中有两点规定:1、接口中只能有定义方法名、方法返回类型,不能有方法的实现。2、实现接口的类,必须实现接口中所有的方法。例如下面的例子://定义接口public interface Action {//接口中的方法定义,只…

java编写通信录管理系统_Java 实现通讯录管理系统教程

本文实例为大家分享了java实现通讯录管理系统的具体代码,供大家参考,具体内容如下完成项目的流程:1.根据需求,确定大体方向2.功能模块分析3.界面实现4.功能模块设计5.coding6.代码测试下面是源代码:import java.awt.Co…

java姑娘_初识java这个小姑娘(二)

正版疯狂java讲义第5版编程教材76.5元(需用券)去购买 >妙解垃圾回收机制周一,早高峰!!!五个字,说尽心中的绝望!!!一段考验一个人耐力、智力、开车技术以及脾气的路。 我把车开进了…

JAVA script 循环 图片_深入分析JavaScript 事件循环(Event Loop)

事件循环(Event Loop),是每个JS开发者都会接触到的概念,但是刚接触时可能会存在各种疑惑。众所周知,JS是单线程的,即同一时间只能运行一个任务。一般情况下这不会引发问题,但是如果我们有一个耗时较多的任务&#xff0…

mysql update 跳过重复_MySQL通过UPDATE / DELETE整合重复的数据记录

我有一个看起来像这样的表:mysql> SELECT * FROM Colors;╔════╦══════════╦════════╦════════╦════════╦════════╦════════╦════════╗║ ID ║ USERNAME ║ RED ║ GREEN ║ YELLOW ║ …

java目录实用工具_JAVA 创建文件和文件夹,删除文件和文件夹的实用工具

package com.file;import java.io.File;import java.io.IOException;//创建新文件和目录public class CCRDFile {// 验证字符串是否为正确路径名的正则表达式private static String matches "[A-Za-z]:\\\\[^:?\">// 通过 sPath.matches(matches) 方法的返回值判…

java 方法重载的作业_java第六章 方法及方法重载 课堂笔记、作业

当参数传递为基本数据类型时,参数变化不保留,基本数据类型参数传值当参数传递为引用数据类型时,参数变化会保留,引用数据类型参数传址//基本数据类型在别处被重新赋值,则本体不受影响,其值不变//引用型数据…

java旋转图片后边上变黑_Java旋转图像将背景的一部分变成黑色

因此,我下载了“原始”图像(不是正方形),对其进行了修改,使其变为正方形,运行您的代码,得到了java.awt.image.ImagingOpException:无法转换src图像异常,将BufferedImage.TYPE_INT_RGB更改为BufferedImage .TYPE_INT_ARGB并得到…import java.awt.geom.AffineTransfo…

python 数据库连接池_【转】Python 数据库连接池

python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此实际使用中,通常会…

python中location_使用python请求模块时的LocationValueError

我一直在使用请求包与Web进行交互,过去没有任何问题 . 最近当使用我大约一周没用过的脚本时,我在执行例程 requests.get() 调用时遇到以下错误:LocationValueError: No host specified.背景研究经过大量的谷歌搜索 python requests LocationV…

java 获取oracle表结构_获取Oracle中所有表的列表?

回答(19)2 years ago我们可以从以下查询获取所有表格,包括列详细信息:SELECT * FROM user_tab_columns;2 years ago使用sqlplus更好地查看如果您正在使用 sqlplus ,您可能需要首先设置一些参数以便在您的列被破坏时更好地查看(退出 sqlplus 会…

java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例

之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了。于是乎我在学会用Java在后台利用Apache poi 生成excel文档提供前台下载之后就…

java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...

/*** * create time [2014-4-13]*/public class Test{public static void main(String args[]){//原有序数组,这里约定数组是升序排列int[] intArray new int[]{1,2,4,6,7,9};int toInsert 8;//待插入数据int subscript 0;//下标//确定下标位置if(toInsert {subscript 0;}e…

php 删除文件夹及文件夹,php删除一个路径下的所有文件夹和文件的方法

php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用。也适合在thinkphp中清理缓存,在thinkphp中可以把下面代码写入./Application/Admin…

PHP制作订货,PHP生成订单号的两种方法

在开发项目的时候经常有生成订单号的需求&#xff0c;这里列出两种生成20位订单号的常用方法。方法一&#xff1a;以下代码是14位当前时间加6位随机数&#xff0c;如果增减位数&#xff0c;只需修改末尾的数字6即可。<?php Function build_order_no(){return date(YmdHis).…

php 分类排序,php将地区分类排序的算法

php将地区分类排序的算法介绍&#xff0c;有需要的朋友可以参考下。写一个函数&#xff0c;用来存储地区数据&#xff1a;复制代码 代码如下:$array array(0>array("","河北"),1>array("","北京"),2>array(0,"保定&quo…