用layui+springboot实现文件上传功能

package whm.sys.controller;
//创建一个FileController文件,用来做文件上传和图片下载
import cn.hutool.core.date.DateUtil;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import whm.commons.AppFileUtils;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Vijay
 * @date 2020/4/14  -19:42
 */
@RestController
@RequestMapping("file")
public class FileController {
    /**
     * 文件上传
     * @param mf
     * @return
     */
    @RequestMapping("uploadFile")
    public Map<String,Object> uploadFile(MultipartFile mf)  {
        //1.得到文件名
        String lastName = mf.getOriginalFilename();
        //2.根据旧的文件名生成新的文件名
        String newName = AppFileUtils.createNewFileName(lastName);
        //3.得到当前日期的字符串
        String dirName = DateUtil.format(new Date(), "yyyy-MM-dd");
        //4.构造文件夹
        File dirFile = new File(AppFileUtils.UPLOAD_PATH,dirName);
        //5.判断当前文件夹是否存在
        if (!dirFile.exists())
        {
            dirFile.mkdirs();
        }
        //6.构造文件对象
        File file = new File(dirFile,newName+"_temp");
        //7.把mf里面的图片信息写入file
        try {
            mf.transferTo(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Map<String, Object> map=new HashMap<>();
        map.put("path",dirName+"/"+newName+"_temp");
        return map;
    }
    /**
     * 图片下载
     */
    @RequestMapping("showImageByPath")
    public ResponseEntity<Object> showImageByPath(String path){
        return AppFileUtils.createResponseEntity(path);
    }

}

将文件上传和下载的核心方法封装成AppFileUtils类

package whm.commons;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @author
 */
public class AppFileUtils {
    /**
     * 文件上传的保存路径  默认值
     */
    public static String UPLOAD_PATH="F:/upload/";
    static {
        //通过反射的方式,读取配置文件的存储地址
        InputStream stream = AppFileUtils.class.getClassLoader().getResourceAsStream("file.properties");//不用默认路径可以设置一个properties文件用来读取
        Properties properties=new Properties();
        try {
            properties.load(stream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String property = properties.getProperty("filepath");
        if(null!=property) {
            UPLOAD_PATH=property;
        }
    }
    /**
     * 根据文件老名字得到新名字
     * @param oldName 文件老名字
     * @return 新名字由32位随机数加图片后缀组成
     */
    public static String createNewFileName(String oldName) {
        //获取文件名后缀
        String stuff=oldName.substring(oldName.lastIndexOf("."), oldName.length());
        //将UUID与文件名后缀进行拼接,生成新的文件名  生成的UUID为32位
        return IdUtil.simpleUUID().toUpperCase()+stuff;
    }
    /**
     * 文件下载
     * @param path
     * @return
     */
    public static ResponseEntity<Object> createResponseEntity(String path) {
        //1,构造文件对象
        File file=new File(UPLOAD_PATH, path);
        if(file.exists()) {
            //将下载的文件,封装byte[]
            byte[] bytes=null;
            try {
                bytes = FileUtil.readBytes(file);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //创建封装响应头信息的对象
            HttpHeaders header=new HttpHeaders();
            //封装响应内容类型(APPLICATION_OCTET_STREAM 响应的内容不限定)
            header.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //创建ResponseEntity对象
            ResponseEntity<Object> entity= new ResponseEntity<Object>(bytes, header, HttpStatus.CREATED);
            return entity;
        }
        return null;
    }

    /**
     * 更该图片的名字 去掉_temp
     * @param goodsImg
     * @return
     */
    public static String renameFile(String goodsImg) {
        File file = new File(UPLOAD_PATH,goodsImg);
        String replace = goodsImg.replace("_temp","");
        if (file.exists()){
            file.renameTo(new File(UPLOAD_PATH,replace));
        }
        return replace;
    }

    /**
     * 根据老路径删除图片
     * @param oldPath
     */
    public static void removeFileByPath(String oldPath) {
        //图片的路径不是默认图片的路径
        if (!oldPath.equals(Constast.DEFAULT_IMG_GOODS)){
            File file = new File(UPLOAD_PATH,oldPath);
            if (file.exists()){
                file.delete();
            }
        }
    }


}

创建一个html文件

<!DOCTYPE html>
<html lang="en"  xmlns:th="http://www.thymeleaf.org"
      xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro"
>
<head>
    <meta charset="UTF-8">
    <title>商品管理</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="Access-Control-Allow-Origin" content="*">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <link rel="icon" href="/favicon.ico">
    <link rel="stylesheet" href="/resources/layui/css/layui.css" media="all"/>
    <link rel="stylesheet" href="/resources/css/public.css" media="all"/>
    <style>
        input#search_provideridTree_select_input_id {
            border-radius: 10px;
            height: 30px;
            margin-top: 4px;
        }
        input#provideridTree_select_input_id {
            border-radius: 10px;
            height: 30px;
            margin-top: 4px;
        }
        input#leaderprovideridTree_select_input_id {
            border-radius: 10px;
            height: 30px;
            margin-top: 4px;
        }
        input.layui-input.layui-unselect {
            border-radius: 10px;
            height: 30px;
            margin-top: 4px;
        }
    </style>
</head>
<body  class="childrenBody">
<!--查询条件开始-->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
    <legend>商品管理</legend>
</fieldset>
<blockquote class="layui-elem-quote">
    <form action="" method="post" id="searchFrm" lay-filter="searchFrm" class="layui-form">
        <div class="layui-form-item">
            <div class="layui-inline">
                <label class="layui-form-label">供应商</label>
                <div class="layui-input-inline">
                    <select name="providerid" id="select_providerid">
                        <option value="0">请选择供应商</option>
                    </select>
                </div>
            </div>
            <div class="layui-inline">
                <label class="layui-form-label">商品名称</label>
                <div class="layui-input-inline">
                    <input type="text" name="goodsname" id="goodsname" class="layui-input input-radius"
                           placeholder="请输入商品名称">
                </div>
            </div>
            <div class="layui-inline">
                <label class="layui-form-label">生产批号</label>
                <div class="layui-input-inline">
                    <input type="text" name="productcode" id="productcode" class="layui-input input-radius" placeholder="请输入生产批号">
                </div>
            </div>
            <div class="layui-inline">
                <label class="layui-form-label">批准文号</label>
                <div class="layui-input-inline">
                    <input type="text" name="promitcode" id="promitcode" class="layui-input input-radius" placeholder="请输入批准文号">
                </div>
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-inline">
                <label class="layui-form-label">商品描述</label>
                <div class="layui-input-inline">
                    <input type="text" name="description" id="description" class="layui-input input-radius"
                           placeholder="请输入商品描述">
                </div>
            </div>
            <div class="layui-inline">
                <label class="layui-form-label">商品规格</label>
                <div class="layui-input-inline">
                    <input type="text" name="size" id="size" class="layui-input input-radius" placeholder="请输入商品规格">
                </div>
            </div>
            <div class="layui-inline" style="padding-left: 3%">
                <button type="button" class="layui-btn layui-btn-sm layui-btn-radius" lay-submit="" lay-filter="doSearch"><i
                        class="layui-icon layui-icon-search layui-icon-normal"></i>查询
                </button>
                <button type="reset" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm"><i
                        class="layui-icon layui-icon-refresh"></i><span>重置</span>
                </button>
            </div>
        </div>
    </form>
</blockquote>
<!--查询条件结束-->

<!--分页表格开始-->
<table class="layui-hide" id="goodsTable" lay-filter="goodsTable"></table>
<div id="goodsToolBar" style="display: none">
    <button type="button" lay-event="add" shiro:hasPermission="goods:create" class="layui-btn layui-btn-sm layui-btn-normal layui-btn-radius">
        <i class="layui-icon layui-icon-add-1"></i>添加商品
    </button>
    <button type="button" lay-event="batchDelete"    class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius"  shiro:hasPermission="goods:batchdelete">
        <i class="layui-icon layui-icon-delete"></i>批量删除
    </button>
</div>
<div id="goodsRowBar" style="display: none;">
    <button type="button" lay-event="update"  class="layui-btn layui-btn-sm layui-btn-radius"><i
            class="layui-icon layui-icon-edit" shiro:haspermission="goods:update"></i>编辑
    </button>
    <button type="button" lay-event="delete" class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius"><i
            class="layui-icon layui-icon-delete" shiro:haspermission="goods:delete"></i>删除
    </button>
</div>
</div>
<!--分页表格结束-->
<!--添加和修改数据表格开始-->
<div id="addOrUpdateDiv" style="display: none;padding: 10px;padding-right: 5%">
    <form action="" method="post" class="layui-form" id="dataFrm" lay-filter="dataFrm">
        <div class="layui-col-md12 layui-col-xs12">
            <div class="layui-row layui-col-space10">
                <div class="layui-col-md9 layui-col-xs7">
                    <div class="layui-form-item magt3">
                        <label class="layui-form-label">供应商</label>
                        <div class="layui-input-block">
                            <select name="providerid" id="providerid">
                                <option value="0">请选择供应商</option>
                            </select>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label">商品名称</label>
                        <div class="layui-input-block">
                            <input type="hidden" name="id">
                            <input type="text" class="layui-input input-radius" name="goodsname" lay-verify="required" placeholder="请输入商品名称">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label">商品描述</label>
                        <div class="layui-input-block">
                            <input type="text" class="layui-input input-radius" name="description" lay-verify="required" placeholder="请输入商品描述">
                        </div>
                    </div>
                </div>
(重点代码在这里) <div class="layui-col-md3 layui-col-xs5"> <div class="layui-upload-list thumbBox mag0 magt3"> <input type="hidden" name="goodsimg" id="goodsimg" value="/file/showImageByPath?path=images/noDefaultImage.jpg"> <img class="layui-upload-img thumbImg" src="/file/showImageByPath?path=images/noDefaultImage.jpg"> </div> </div> </div> <div class="layui-form-item magb0"> <div class="layui-inline"> <label class="layui-form-label">产地</label> <div class="layui-input-inline"> <input type="text" class="layui-input input-radius" name="produceplace" lay-verify="required" placeholder="请输入商品产地"> </div> </div> <div class="layui-inline"> <label class="layui-form-label">包装</label> <div class="layui-input-inline"> <input type="text" class="layui-input input-radius" name="goodspackage" lay-verify="required" placeholder="请输入商品包装"> </div> </div> <div class="layui-inline"> <label class="layui-form-label">规格</label> <div class="layui-input-inline"> <input type="text" class="layui-input input-radius" name="size" lay-verify="required" placeholder="请输入商品规格"> </div> </div> <div class="layui-inline"> <label class="layui-form-label">生产批号</label> <div class="layui-input-inline"> <input type="text" class="layui-input input-radius" name="productcode" lay-verify="required" placeholder="请输入商品生产批号"> </div> </div> <div class="layui-inline"> <label class="layui-form-label">批准文号</label> <div class="layui-input-inline"> <input type="text" class="layui-input input-radius" name="promitcode" lay-verify="required" placeholder="请输入商品批准文号"> </div> </div> <div class="layui-inline"> <label class="layui-form-label">销售价格</label> <div class="layui-input-inline"> <input type="text" class="layui-input input-radius" name="price" lay-verify="required|number" placeholder="请输入商品销售价格"> </div> </div> <div class="layui-inline"> <label class="layui-form-label">库存量</label> <div class="layui-input-inline"> <input type="text" class="layui-input input-radius" name="number" lay-verify="required|number" placeholder="请输入商品库存量"> </div> </div> <div class="layui-inline"> <label class="layui-form-label">预警值</label> <div class="layui-input-inline"> <input type="text" class="layui-input input-radius" name="dangernum" lay-verify="required|number" placeholder="请输入商品预警值"> </div> </div> <div class="layui-inline"> <label class="layui-form-label">是否可用</label> <div class="layui-input-inline"> <input type="radio" name="available" value="1" title="可用" checked=""> <input type="radio" name="available" value="0" title="不可用" > </div> </div> </div> </div> <div class="layui-form-item"> <div class="layui-input-block" style="text-align: center;padding-right: 7%"> <button type="button" class="layui-btn layui-btn-radius" lay-submit="" lay-filter="doSubmit" id="doSubmit"><i class="layui-icon layui-icon-search layui-icon-normal"></i>提交 </button> <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm"><i class="layui-icon layui-icon-refresh"></i><span>重置</span> </button> </div> </div> </form> </div> <!--添加和修改数据表格结束--> <script type="text/javascript" src="/resources/layui/layui.js"></script> <script type="text/javascript"> layui.use(['jquery', 'form', 'layer', 'laydate', 'table','layedit','upload'], function () { var $ = layui.jquery; var form=layui.form; var layer = layui.layer; var table = layui.table; var layedit=layui.layedit; var upload=layui.upload; //打开添加页面 var mainIndex; var type; //初始化表格 var tableIns = table.render({ elem: "#goodsTable", title: "日志数据表格", url: "/good/loadAllgoods", toolbar: "#goodsToolBar", page: true, height: "full-190", cols: [ [ {field: 'id', title: 'ID', align: 'center',width:'50'}, {field: 'goodsname', title: '商品名称', align: 'center',width:'150'}, {field: 'providername', title: '供应商', align: 'center',width:'150'}, {field: 'produceplace', title: '商品产地', align: 'center',width:'150'}, {field: 'description', title: '商品描述', align: 'center',width:'150'}, {field: 'price', title: '销售价格', align: 'center',width:'90'}, {field: 'number', title: '数量', align: 'center',width:'90'}, {field: 'dangernum', title: '库存预警值', align: 'center',width:'100'}, {field: 'goodsimg', title: '商品图片', align: 'center',width:'150', templet:function(d){ return '<img width=40 height=40 src=/file/showImageByPath?path='+d.goodsimg+ ' />'; }}, {field: 'size', title: '规格', align: 'center',width:'120'}, {field: 'goodspackage', title: '包装', align: 'center',width:'120'}, {field: 'productcode', title: '生产批号', align: 'center',width:'130'},               {field: 'available', title: '是否可用', align: 'center',width:'100',templet:function (d) { return d.available==1?'<font color="blue">可用</font>':'<font color="red">不可用</font>'; }}, {fixed: 'right', title: '操作', toolbar: '#goodsRowBar', align: 'center',width:'180'} ] ], done:function (data, curr, count) { //不是第一页时,如果当前返回的数据为0那么就返回上一页 if(data.data.length==0&&curr!=1){ tableIns.reload({ page:{ curr:curr-1 } }) } } }); //查询可用的供应商 $.ajax({ url: "/good/loadAllgoodsProviders", //请求的URL地址 type: "GET", //请求方法,GET、POST、PUT、DELETE在这里设置 timeout: 5000, //超时时间 dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text success: function (res) { //成功的回调函数 var data=res.data; var html=' <option value="0">请选择供应商</option>'; var dom=$("#select_providerid"); $.each(data,function (index,item) { html+=' <option value='+item.id+'>'+item.providername+'</option>'; }) dom.html(html); form.render("select") } }) //监控模糊查询按钮事件 form.on("submit(doSearch)", function (data) { tableIns.reload({ where: data.field, page: { curr: 1 } }); return false; }); //监控工具条事件 //批量删除和添加 table.on("toolbar(goodsTable)", function (obj) { switch (obj.event) { case 'add': openAdd(); break; case 'batchDelete': batchDelete(); break; }; }); //监控行工具条事件 //查看,编辑,删除 table.on("tool(goodsTable)",function (obj) { //获取当前行数据 var data = obj.data; switch (obj.event){ case 'show': showgoods(data); break; case 'update': updategoods(data); break; case 'delete': deletegoods(data); break; }; }); //打开添加的弹出层 function openAdd() { mainIndex = layer.open({ type:1, content:$("#addOrUpdateDiv"), area:['800px','550px'], title:'添加商品', success:function () { $('#dataFrm')[0].reset(); type="POST"; $.ajax({ url: "/good/loadAllgoodsProviders", //请求的URL地址 type: "GET", //请求方法,GET、POST、PUT、DELETE在这里设置 timeout: 5000, //超时时间 dataType: 'json', success: function (res) { //成功的回调函数 var data=res.data; var html=' <option value="0">请选择供应商</option>'; var dom=$("#providerid"); $.each(data,function (index,item) { html+=' <option value='+item.id+'>'+item.providername+'</option>'; }) dom.html(html); form.render("select") } }) //设置默认为无图片 $(".thumbImg").attr("src","/file/showImageByPath?path=images/noDefaultImage.jpg"); $("#goodsimg").val("/images/noDefaultImage.jpg"); } }); }; //打开修改的弹出层 function updategoods(data) { mainIndex = layer.open({ type:1, content:$("#addOrUpdateDiv"), area:['800px','550px'], title:'修改商品', success:function () { //装载新的数据 $('#dataFrm')[0].reset(); form.val("dataFrm",data); $(".thumbImg").attr("src",'/file/showImageByPath?path='+data.goodsimg); $.ajax({ url: "/good/loadAllgoodsProviders", //请求的URL地址 type: "GET", //请求方法,GET、POST、PUT、DELETE在这里设置 timeout: 5000, //超时时间 dataType: 'json', success: function (res) { //成功的回调函数 var html=' <option value="0">请选择供应商</option>'; var dom=$("#providerid"); var resdata=res.data; $.each(resdata,function (index,item) { if (data.providerid===item.id) { html+=' <option value='+item.id+' selected>'+item.providername+'</option>'; } else { html+=' <option value='+item.id+'>'+item.providername+'</option>'; } }) dom.html(html); form.render("select") } }) //装载新的数据 type="PUT"; } }); }; //提交修改和添加的弹出层数据 $("#doSubmit").click(function () { //同步富文本和textarea里面的内容 var datas = $("#dataFrm").serialize(); $.ajax({ url:"/good/goods", //请求的URL地址 type:type, //请求方法,GET、POST、PUT、DELETE在这里设置 timeout:5000, //超时时间 dataType:'json', data:datas, //返回的数据格式:json/xml/html/script/jsonp/text success:function(data){ //成功的回调函数 if (data.code==200){ tableIns.reload(); layer.msg(data.msg) //设置id为result的标签的html内容为返回的data数据 layer.close(mainIndex); } else { layer.msg(data.msg) //设置id为result的标签的html内容为返回的data数据 } }, }) }); //文件上传(重点代码在这里) upload.render({ elem: '.thumbBox', url: '/file/uploadFile',(后台请求) acceptMime:'image/*', field:'mf', method : "post", done: function(res, index, upload){ var path=res.path; $('.thumbImg').attr('src','/file/showImageByPath?path='+path); $('.thumbBox').css("background","#fff"); //给隐藏域赋值 $("#goodsimg").val(path); }
+ }); //删除 function deletegoods(data) { layer.confirm('你确定要删除这条数据吗?',{icon: 3,title:'提示'},function (index) { $.ajax({ url:"/good/goods", //请求的URL地址 type:"DELETE", //请求方法,GET、POST、PUT、DELETE在这里设置 timeout:5000, //超时时间 dataType:'json', data:{id:data.id}, //返回的数据格式:json/xml/html/script/jsonp/text success:function(res){ //成功的回调函数 if (res.code==200){ tableIns.reload({ where:"", }); layer.msg(res.msg); } }, }) layer.close(index); }); } //批量删除 function batchDelete() { //得到选中行 var checkStatus = table.checkStatus('goodsTable'); var dataLength = checkStatus.data.length; if (dataLength>0){ layer.confirm('你确定要删除这些数据吗?',{icon: 3,title: '提示'},function (index) { //获取选中行数据 var data = checkStatus.data; var ids = ""; $.each(data,function (index, item) { if (index==0){ ids+="ids="+item.id; }else { ids+="&ids="+item.id; } }); $.post("/goods/batchDeletegoods",ids,function (res) { if (res.code==200){ //重新刷新表格 tableIns.reload({ where:"", }); } layer.msg(res.msg); }); layer.close(index); }); }else { layer.msg("请选中操作行") } } }); </script> </body> </html>                                                                                                                                       
               

  

猜你喜欢

转载自www.cnblogs.com/420ITboy/p/12750447.html