Spring之文件上传下载,jrebel,多文件上传

news2024/11/25 18:25:59
  • 文件上传,文件下载
  • jrebel&多文件上传

1.文件上传,文件下载

文件上传

1.spring-xml配置多功能视图解析器

2.前端标记表单为多功能表单enctype=”mutipart/form-data“

3.后端可以直接利用mutipartFile类,接受前端传递到后台的文件

4.将文件转成流,然后写到服务器(某一个硬盘)

5.做硬盘于网络地址的映射(服务器配置)

package com.zlj.web;

import com.zlj.biz.StuBiz;
import com.zlj.model.Stu;
import com.zlj.util.PageBean;
import com.zlj.util.PropertiesUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @author zlj
 * @create 2023-09-08 16:55
 */
@Controller
@RequestMapping("stu")
public class StuController {
    @Autowired
    private StuBiz stuBiz;

    //    增
    @RequestMapping("/add")
    public String add(Stu stu,HttpServletRequest request) {
        int i = stuBiz.insert(stu);
        return "redirect:list";
    }

    //            删
    @RequestMapping("/del/{sid}")
    public String del(@PathVariable("sid") Integer sid) {
        stuBiz.deleteByPrimaryKey(sid);
        return "redirect:/stu/list";
    }

//        改
@RequestMapping("/edit")
public String edit(Stu stu) {
    stuBiz.updateByPrimaryKeySelective(stu);
    return "redirect:list";
}
//文件上传
    @RequestMapping("/upload")
    public String upload(Stu stu,MultipartFile xxx){
        try {
//    3.后端可以直接利用mutipartFile类,接受前端传递到后台的文件
//    4.将文件转成流,然后写到服务器(某一个硬盘)
//    上传的图片真实的地址
        String dir= PropertiesUtil.getValue("dir");
//        网络访问的地址
        String server=PropertiesUtil.getValue("server");;
        //文件名
        String filename=xxx.getOriginalFilename();
        System.out.println("文件名"+filename);
        System.out.println("文件类别"+xxx.getContentType());
        FileUtils.copyInputStreamToFile(xxx.getInputStream(),new File(dir+filename));
//      /upload/0703.png
        stu.setSpic(server+filename);
        stuBiz.updateByPrimaryKeySelective(stu);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "redirect:list";
}


//                查
    @RequestMapping("/list")
    public String list(Stu stu, HttpServletRequest request) {
        //stu是用来接收前台传递后台的参数
        PageBean pageBean = new PageBean();
        pageBean.setRequest(request);
        List<Stu> stus = stuBiz.ListPager(stu, pageBean);
        request.setAttribute("lst", stus);
        request.setAttribute("pageBean", pageBean);
//      WEB-INF/jsp/stu/list.jsp
        return "stu/list";

    }

    @RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(Stu stu,HttpServletRequest req){

        try {
            //先根据文件id查询对应图片信息
            Stu stus = this.stuBiz.selectByPrimaryKey(stu.getSid());
            String diskPath = PropertiesUtil.getValue("dir");
            String reqPath = PropertiesUtil.getValue("server");
//            /upload/0703.png  -->D:/temp/upload/0703.png
            String realPath = stus.getSpic().replace(reqPath,diskPath);
            String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
            //下载关键代码
            File file=new File(realPath);
            HttpHeaders headers = new HttpHeaders();//http头信息
            String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
            headers.setContentDispositionFormData("attachment", downloadFileName);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    //数据回显
    @RequestMapping("/preSave")
    public String preSave(Stu stu, Model model) {
        if (stu != null && stu.getSid() != null && stu.getSid() != 0) {
            Stu s = stuBiz.selectByPrimaryKey(stu.getSid());
            model.addAttribute("s", s);
        }
        return "stu/edit";
    }
}
//list.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@include file="/common/header.jsp"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>学生信息</title>
</head>
<body>
<form class="form-inline"
      action="${ctx}/stu/list" method="post">
    <div class="form-group mb-2">
        <input type="text" class="form-control-plaintext" name="same"
               placeholder="请输入学生姓名">
        <!-- 			<input name="rows" value="20" type="hidden"> -->
        <!-- 不想分页 -->
        <%--        <input name="pagination" value="false" type="hidden">--%>
    </div>
    <button type="submit" class="btn btn-primary mb-2">查询</button>
    <a class="btn btn-primary mb-2" href="${ctx}/stu/preSave">新增</a>
</form>

<table class="table table-striped">
    <thead>
    <tr>
        <th scope="col">学生id</th>
        <th scope="col">学生姓名</th>
        <th scope="col">学生年龄</th>
        <th scope="col">学生图片</th>
        <th scope="col">操作</th>
    </tr>
    </thead>
    <tbody>
    <c:forEach  var="s" items="${lst }">
        <tr>
            <td>${s.sid }</td>
            <td>${s.same }</td>
            <td>${s.sage }</td>
            <td>
                <img src="${s.spic}" style="height:100px;width:60px;">
            </td>
            <td>
                <a href="${ctx}/stu/preSave?sid=${s.sid}">修改</a>
                <a href="${ctx}/stu/del/${s.sid}">删除</a>
                <a href="${ctx}/page/stu/upload?sid=${s.sid}">图片上传</a>
                <a href="${ctx}/stu/download?sid=${s.sid}">图片下载</a>
            </td>
        </tr>
    </c:forEach>
    </tbody>
</table>
<!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
<z:page pageBean="${pageBean }"></z:page>
</body>
</html>
//upload.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%@include file="/common/header.jsp"%>
<html>
<head>
    <title>学生log上传</title>
</head>
<body>
<form action="${ctx}/stu/upload" method="post" enctype="multipart/form-data">
    <label>学生编号:</label><input type="text" name="sid" readonly="readonly" value="${param.sid}"/><br/>
    <label>班级图片:</label><input type="file" name="xxx"/><br/>
    <input type="submit" value="上传图片"/>
</form>
</body>
</html>

2.jrebel&多文件上传

jrebel使用

1下载插件。
2.下载后,打开IDEA,选择File—>Settings—>Plugins—>设置按钮—>Installed Plugin from Disk(从文件夹选择已下载的插件安装)。

3.重启IDEA
4.选择File—>Settings—>JRebel & XRebel—>Change license

5.安装JRebel插件后,注册地址填写网址 + 生成的GUID,邮箱随便填写,然后即可。
http://jrebel-license.jiweichengzhu.com/{GUID}
https://jrebel.qekang.com/{GUID}
GUID可以使用在线GUID在线生成在线生成,然后替换{GUID}就行。
6.下面邮箱地址可随便输入。
7.选择我同意
8.提交

多文件上传

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%@include file="/common/header.jsp"%>
<html>
<head>
    <title>学生log上传</title>
</head>
<body>
<form action="${ctx}/stu/upload" method="post" enctype="multipart/form-data">
    <label>学生编号:</label><input type="text" name="sid" readonly="readonly" value="${param.sid}"/><br/>
    <label>班级图片:</label><input type="file" name="xxx"/><br/>
    <input type="submit" value="上传图片"/>
</form>
<form method="post" action="${ctx}/stu/uploads" enctype="multipart/form-data">
    <input type="file" name="files" multiple>
    <button type="submit">上传</button>
</form>
</body>
</html>
package com.zlj.web;

import com.zlj.biz.StuBiz;
import com.zlj.model.Stu;
import com.zlj.util.PageBean;
import com.zlj.util.PropertiesUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @author zlj
 * @create 2023-09-08 16:55
 */
@Controller
@RequestMapping("stu")
public class StuController {
    @Autowired
    private StuBiz stuBiz;

    //    增
    @RequestMapping("/add")
    public String add(Stu stu,HttpServletRequest request) {
        int i = stuBiz.insert(stu);
        return "redirect:list";
    }

    //            删
    @RequestMapping("/del/{sid}")
    public String del(@PathVariable("sid") Integer sid) {
        stuBiz.deleteByPrimaryKey(sid);
        return "redirect:/stu/list";
    }

//        改
@RequestMapping("/edit")
public String edit(Stu stu) {
    stuBiz.updateByPrimaryKeySelective(stu);
    return "redirect:list";
}
//文件上传
    @RequestMapping("/upload")
    public String upload(Stu stu,MultipartFile xxx){
        try {
//    3.后端可以直接利用mutipartFile类,接受前端传递到后台的文件
//    4.将文件转成流,然后写到服务器(某一个硬盘)
//    上传的图片真实的地址
        String dir= PropertiesUtil.getValue("dir");
//        网络访问的地址
        String server=PropertiesUtil.getValue("server");;
        //文件名
        String filename=xxx.getOriginalFilename();
        System.out.println("文件名"+filename);
        System.out.println("文件类别"+xxx.getContentType());
        FileUtils.copyInputStreamToFile(xxx.getInputStream(),new File(dir+filename));
//      /upload/0703.png
        stu.setSpic(server+filename);
        stuBiz.updateByPrimaryKeySelective(stu);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "redirect:list";
}


//                查
    @RequestMapping("/list")
    public String list(Stu stu, HttpServletRequest request) {
        //stu是用来接收前台传递后台的参数
        PageBean pageBean = new PageBean();
        pageBean.setRequest(request);
        List<Stu> stus = stuBiz.ListPager(stu, pageBean);
        request.setAttribute("lst", stus);
        request.setAttribute("pageBean", pageBean);
//      WEB-INF/jsp/stu/list.jsp
        return "stu/list";

    }
//下载文件
    @RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(Stu stu,HttpServletRequest req){

        try {
            //先根据文件id查询对应图片信息
            Stu stus = this.stuBiz.selectByPrimaryKey(stu.getSid());
            String diskPath = PropertiesUtil.getValue("dir");
            String reqPath = PropertiesUtil.getValue("server");
//            /upload/0703.png  -->D:/temp/upload/0703.png
            String realPath = stus.getSpic().replace(reqPath,diskPath);
            String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
            //下载关键代码
            File file=new File(realPath);
            HttpHeaders headers = new HttpHeaders();//http头信息
            String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
            headers.setContentDispositionFormData("attachment", downloadFileName);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    //多文件上传
    @RequestMapping("/uploads")
    public String uploads(HttpServletRequest req, Stu stu, MultipartFile[] files){
        try {
            StringBuffer sb = new StringBuffer();
            for (MultipartFile file : files) {
                //思路:
                //1) 将上传图片保存到服务器中的指定位置
                String dir = PropertiesUtil.getValue("dir");
                String server = PropertiesUtil.getValue("server");
                String filename = file.getOriginalFilename();
                FileUtils.copyInputStreamToFile(file.getInputStream(),new File(dir+filename));
                sb.append(filename).append(",");
            }
            System.out.println(sb.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }



    //数据回显
    @RequestMapping("/preSave")
    public String preSave(Stu stu, Model model) {
        if (stu != null && stu.getSid() != null && stu.getSid() != 0) {
            Stu s = stuBiz.selectByPrimaryKey(stu.getSid());
            model.addAttribute("s", s);
        }
        return "stu/edit";
    }
}

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

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

相关文章

DedeCMS_v5.7其他漏洞复现

一、URL重定向 http://127.0.0.1/DedeCMS-V5.7-UTF8-SP2/uploads/plus/download.php?open1&linkaHR0cDovL3d3dy5iYWlkdS5jb20 其中aHR0cDovL3d3dy5iYWlkdS5jb20是http://www.baidu.com的base64编码 访问后发现直接转到百度 二、后台shops_delivery_存储型XSS 管理员在…

30m退耕还湿空间数据集(2000-2010年,青藏高原地区)

摘要 a. 数据内容&#xff08;数据文件/表名称&#xff0c;包含的观测指标内容&#xff09; 30m退耕还湿空间数据集(2000-2010年&#xff0c;青藏高原地区)&#xff0c;反映了2000年至2010年期间青藏高原地区耕地退耕还湿的空间分布情况。 b. 建设目的 监测青藏高原地区的退耕还…

10 大演讲主题、14 位技术大咖!龙蜥大讲堂 9 月直播预告硬核来袭

「龙蜥大讲堂」9 月精彩预告来了&#xff0c;点击下方海报抢先了解。本月又是满满的技术干货分享&#xff0c;多位大咖带你共享技术盛宴&#xff01;提前进群&#xff0c;参与互动还有龙蜥精美周边等你来拿。 9 月精彩分享直达 &#x1f447; 加入龙蜥社区钉钉交流群&#xff0…

Springboot+swagger2

1.swagger配置 /*** Swagger 配置文件*/ Configuration public class SwaggerConfig {Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.swagger.two&qu…

神经网络 02(激活函数)

一、激活函数 在神经元中引入了激活函数&#xff0c;它的本质是向神经网络中引入非线性因素的&#xff0c;通过激活函数&#xff0c;神经网络就可以拟合各种曲线。 如果不用激活函数&#xff0c;每一层输出都是上层输入的线性函数&#xff0c;无论神经网络有多少层&#xff0c…

华为云云服务器云耀L实例评测 | 智能不卡顿:如何实现流畅的业务运行

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

数据分享|R语言武汉流动人口趋势预测:灰色模型GM(1,1)、ARIMA时间序列、logistic逻辑回归模型...

全文链接&#xff1a;http://tecdat.cn/?p32496 人口流动与迁移&#xff0c;作为人类产生以来就存在的一种社会现象&#xff0c;伴随着人类文明的不断进步从未间断&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 人力资源是社会文明进步、人民富裕…

视频直播点播平台EasyDSS如何单独保存录像计划文件?具体如何操作呢?

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 有用户反馈&#xff1a;在视频直播点播平台EasyDSS中设置了片段形…

this执行问题

1.代码 var a 10;let obj {a: 20,n: function () {console.log(this.a);},};let fn obj.n;fn(); //此时的this指向windowobj.n(); //this指向obj这个对象 2.打印的结果 3.代码分析 let fn obj.n;将函数体复制给fn fn()是普通函数this指向window obj.fn里面的函数,可以理…

Autojs 小游戏实践-潮玩宇宙开扭蛋

概述 最近在玩潮流宇宙&#xff0c;里面有扭蛋兔的一个玩法&#xff0c;开始有很多蛋&#xff0c;需要我们一个个点开&#xff0c;然后根据装备品质替换分解&#xff0c;潮流提供了自动开扭蛋功能&#xff0c;但是开到品质比自己装备好的时候回暂停&#xff0c;由于个人懒得看…

【小黑送书—第一期】>>《Kali Linux高级渗透测试》

对于企业网络安全建设工作的质量保障&#xff0c;业界普遍遵循PDCA&#xff08;计划&#xff08;Plan&#xff09;、实施&#xff08;Do&#xff09;、检查&#xff08;Check&#xff09;、处理&#xff08;Act&#xff09;&#xff09;的方法论。近年来&#xff0c;网络安全攻…

基于elasticsearch-8.8.2 kibana-8.8.2 搭建一个文搜图系统demo

数据来源是由 图片url,图片descript,图片keywords 外加一个id 基于此首先创建 索引, keywords是一组由单词或词组 组成的一组数据,所以以数组形式压入数据: descript 是由两条语句组合成的数据(针对图片的两种不同描述) # 这里创建的keywords 数组元素类型为text,即可以模糊匹…

Python爬虫-IP隐藏技术与代理爬取

前言 在进行爬虫程序开发和运行时&#xff0c;常常会遇到目标网站的反爬虫机制&#xff0c;最常见的就是IP封禁&#xff0c;这时需要使用IP隐藏技术和代理爬取。 一、IP隐藏技术 IP隐藏技术&#xff0c;即伪装IP地址&#xff0c;使得爬虫请求的IP地址不被目标网站识别为爬虫。…

网络层IP协议

目录 前言 1.如何理解IP协议 2.IP协议格式 3.网段划分 4.特殊的IP地址 5.IP地址的数量限制 6.私有IP地址和公网IP地址 7.路由 总结 前言 在前面的文章中介绍了关于传输层常用的两个协议&#xff0c;UDP协议和TCP协议&#xff0c;当数据经过传输层之后&#xff0c;进入网…

关于ESP32S3无法识别到端口问题

前言 &#xff08;1&#xff09;因为实习问题&#xff0c;需要使用ESP32BOX进行二次开发。一般来说&#xff0c;接触一款MCU&#xff0c;3天上手是基本操作。但是对于乐鑫的芯片&#xff0c;环境搭建是真的折磨人&#xff08;苦笑&#xff09;&#xff0c;而且官方文档几乎没有…

软件测试———linux

文章目录 基础1. 发展史2 特征3 内核版本号的特征4.发布版5,安装 第二章Linux的常见命令Linux命令vi的使用文件的操作文件的压缩和解压缩文件阅读命令权限的操作用户设置配置系统查看名命令 基础 1. 发展史 unix—>BSD(TCP的使用)---->GNU---->Minix—>linux 2 …

使用Process Explorer查看线程的函数调用堆栈去排查程序高CPU占用问题

目录 1、问题描述 2、使用Process Explorer排查软件高CPU占用的一般思路 3、使用Process Explorer工具进行分析 3.1、找到CPU占用高的线程 3.2、查看CPU占用高的线程的函数调用堆栈&#xff0c;找到出问题的代码 3.3、libwebsockets库导出接口lws_service的说明 3.4、解…

200个常用的Python编程相关英语词汇以及它们的中文释义

大家好&#xff0c;我是涛哥。 好多小伙伴反馈说在学习python的过程中&#xff0c;遇到的英文比较多&#xff0c;为自己的学习和开发产生了很大的阻力&#xff0c;所以为大家梳理了一份 Python编程相关常用的英语词汇以及它们的中文释义&#xff0c;当你刚开始学习Python编程的…

SpringBoot整合Easy-ES操作演示文档

文章目录 SpringBoot整合Easy-ES操作演示文档1 概述及特性1.1 官网1.2 主要特性 2 整合配置2.1 导入POM2.2 Yaml配置2.3 EsMapperScan 注解扫描2.4 配置Entity2.5 配置Mapper 3 基础操作3.1 批量保存3.2 数据更新3.3 数据删除3.4 组合查询3.5 高亮查询3.6 统计查询 4 整合异常4…

Java“牵手”天猫商品列表页数据采集+商品价格数据排序,商品销量排序数据,天猫商品API采集方法

天猫商品列表API是天猫平台提供给开发者的应用程序编程接口&#xff0c;通过API可以获取天猫平台上商品列表数据。 天猫商品列表API的使用需要获取Access Token&#xff0c;它代表了访问天猫API的身份认证。 天猫商品列表API的使用步骤如下&#xff1a; 开发者在天猫开发者中…