文件(图片)上传保存与展示

1.前端发起请求插入图片(单图),页面要求:

  • 引入fileinput插件

<script src="/assets/js/bootstrap.min.js"></script>
<link href="/js/fileinput/css/fileinput.css" media="all" rel="stylesheet" type="text/css" /> 
<script src="/js/fileinput/js/fileinput.js" type="text/javascript"></script>
<script src="/js/fileinput/js/fileinput_locale_zh.js" type="text/javascript"></script>
  • 有一个文本域,文本域class属性等于file,
<input id="rimageFile" name="rimageFile" class="file" type="file">
  • 或者使用
<input id="rimageFile" name="rimageFile" type="file" > 
<script >
$(function(){
$("#rimageFile").fileinput({ 
});
})
</script>
  • 请求方式post,entype都必须写

控制器层接收:

更改文件名,存为对象属性值,保存图片地址到数据库

 private void withFile(Route route, MultipartFile rimageFile, HttpServletRequest request) throws IOException {
        String realPath = request.getServletContext().getRealPath("/img/product/rimage/");
        String originalFilename = rimageFile.getOriginalFilename();
        String fileName= UUID.randomUUID().toString().replace("-","")+ originalFilename.substring(originalFilename.lastIndexOf("."));
        File imgs= new File(realPath);
        if(!imgs.exists()){
            imgs.mkdirs();
        }
        rimageFile.transferTo(new File(imgs,fileName));
        route.setRimage("/img/product/rimage/"+fileName);
    }

2.数据库图片回显到页面(单图)

正常获取对象把图片地址传到后台

 @RequestMapping("/route/toupdate/{rid}")
    public String toupdate(@PathVariable("rid") Integer rid, Model model){
        List<Seller> list1 = sellerService.getSellerList();
        model.addAttribute("ss",list1);
        List<Category> getcategorys = categoryService.getcategorys();
        model.addAttribute("cs",getcategorys);
        Route route = routeService.findByid(rid);
        model.addAttribute("r",route);
        return "route/update";
    }

更新页面接收,页面要求:

引入fileinput插件

使用以下代码

<input id="rimageFile" name="rimageFile" type="file" th:value="${r.rimage}"
                               data-min-file-count="1">
                        <script th:inline="javascript">
                            $(function(){
                                var rimage = '/' + [[${r.rimage}]];
                                $("#rimageFile").fileinput({
                                    initialPreview: [
                                        "<img src='" + rimage +"' class='file-preview-image' >"
                                    ],
                                    overwriteInitial: true
                                });
                            })
                        </script>

单图更新同插入;

---------------------------------------------------------------------------------------------------------------------------

多图操作:多图从数据库回显到页面,控制器层得到关联的id和图片的list集合,页面使用js回显

 @RequestMapping("/route/image/{rid}")
    public String getImages(@PathVariable("rid") Integer rid,Model model){
        List<RoutePictureVO> byRid = routeService.findByRid(rid);
        model.addAttribute("pp",byRid);
        return "/route/image";
    }

页面引入fileinput插件,其他基本不用修改(主要在js里面操作),文本域使用mutiple表示允许多文件上传(这里)

页面示例:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta charset="utf-8" />
    <title>商品详细图片</title>

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />

    <!-- bootstrap & fontawesome -->
    <link rel="stylesheet" href="/assets/css/bootstrap.min.css" />
    <link rel="stylesheet" href="/assets/font-awesome/4.5.0/css/font-awesome.min.css" />

    <!-- page specific plugin styles -->

    <!-- text fonts -->
    <link rel="stylesheet" href="/assets/css/fonts.googleapis.com.css" />

    <!-- ace styles -->
    <link rel="stylesheet" href="/assets/css/ace.min.css" class="ace-main-stylesheet" id="main-ace-style" />

    <!--[if lte IE 9]>
    <link rel="stylesheet" href="/assets/css/ace-part2.min.css" class="ace-main-stylesheet" />
    <![endif]-->
    <link rel="stylesheet" href="/assets/css/ace-skins.min.css" />
    <link rel="stylesheet" href="/assets/css/ace-rtl.min.css" />

    <!--[if lte IE 9]>
    <link rel="stylesheet" href="/assets/css/ace-ie.min.css" />
    <![endif]-->

    <!-- inline styles related to this page -->

    <!-- ace settings handler -->
    <script src="/assets/js/ace-extra.min.js"></script>

    <!-- HTML5shiv and Respond.js for IE8 to support HTML5 elements and media queries -->

    <!--[if lte IE 8]>
    <script src="/assets/js/html5shiv.min.js"></script>
    <script src="/assets/js/respond.min.js"></script>
    <![endif]-->

    <!--[if !IE]> -->
    <script src="/assets/js/jquery-2.1.4.min.js"></script>

    <!-- <![endif]-->

    <!--[if IE]>
    <script src="/assets/js/jquery-1.11.3.min.js"></script>
    <![endif]-->
    <script src="/assets/js/bootstrap.min.js"></script>

    <!-- page specific plugin scripts -->
    <script src="/assets/js/jquery.dataTables.min.js"></script>
    <script src="/assets/js/jquery.dataTables.bootstrap.min.js"></script>
    <script src="/assets/js/dataTables.buttons.min.js"></script>
    <script src="/assets/js/buttons.flash.min.js"></script>
    <script src="/assets/js/buttons.html5.min.js"></script>
    <script src="/assets/js/buttons.print.min.js"></script>
    <script src="/assets/js/buttons.colVis.min.js"></script>
    <script src="/assets/js/dataTables.select.min.js"></script>

    <!-- ace scripts -->
    <script src="/assets/js/ace-elements.min.js"></script>
    <script src="/assets/js/ace.min.js"></script>

    <script language="javascript" type="text/javascript" src="/js/My97DatePicker/WdatePicker.js"></script>

    <link href="/js/fileinput/css/fileinput.css" media="all" rel="stylesheet" type="text/css" />
    <script src="/js/fileinput/js/fileinput.js" type="text/javascript"></script>
    <script src="/js/fileinput/js/fileinput_locale_zh.js" type="text/javascript"></script>

</head>

<body class="no-skin">

<div th:replace="header :: navbar"></div>

<div class="main-container ace-save-state" id="main-container">
    <script type="text/javascript">
        try{ace.settings.loadState('main-container')}catch(e){}
    </script>

    <div th:replace="left :: sidebar"></div>

    <div class="main-content">
        <div class="main-content-inner">
            <div class="breadcrumbs ace-save-state" id="breadcrumbs">
                <ul class="breadcrumb">
                    <li>
                        <i class="ace-icon fa fa-home home-icon"></i>
                        <a href="#">首页</a>
                    </li>

                    <li>
                        <a href="#">用户</a>
                    </li>
                    <li class="active">用户管理</li>
                </ul><!-- /.breadcrumb -->

            </div>

            <div class="page-content">

                <form action="/route/doimage" enctype="multipart/form-data" method="post">
					<!-- TODO 处理隐藏域,记录线路ID -->
                <input type="text" name="rid" th:value="${pp[0].rid}">
                    <div class="form-group">
                        <label for="bigPicFile">详细大图:</label>
                        <input id="bigPicFile" name="bigPicFile" type="file" multiple >
                    </div>
                    <div class="form-group">
                        <label for="smallPicFile">详细小图:</label>
                        <input id="smallPicFile" name="smallPicFile" type="file" multiple  >
                    </div>

                    <div class="form-group" style="text-align: center">
                        <input class="btn btn-primary" type="submit" value="提交" />
                        <input class="btn btn-default" type="reset" value="重置" />
                        <input class="btn btn-default" type="button" value="返回" />
                    </div>
                </form>

            </div><!-- /.page-content -->
			<!-- TODO 处理详细图片回显 -->
            <script th:inline="javascript">
                var ri = [[${pp}]]; //后台查询的图片列表
                console.log(ri)
                var bi = []; //回显的大图数组
                var si = []; //回显的小图数组
                for (var i = 0; i < ri.length; i++) {
                    bi.push("<img src='/" + ri[i].bigpic +"' class='file-preview-image' >");
                    si.push("<img src='/" + ri[i].smallpic +"' class='file-preview-image' >");
                }

                $("#bigPicFile").fileinput({
                    initialPreview: bi,
                    overwriteInitial: true,
                    minFileCount: 1,
                    maxFileCount: 4
                });
                $("#smallPicFile").fileinput({
                    initialPreview: si,
                    overwriteInitial: true,
                    minFileCount: 1,
                    maxFileCount: 4
                });
            </script>
        </div>
    </div><!-- /.main-content -->

</div><!-- /.main-container -->

</body>
</html>

插入多图片回显到数据库,思路,在回显的页面可以直接进行修改,点击提交就可以将页面的表单提交

将页面表单提交的数组数据遍历,整合成一个实体对象集合,在service层先删除原来的数据,再遍历集合逐个添加

@RequestMapping("/route/doimage")
public String doimage(Integer rid,MultipartFile[] bigPicFile,MultipartFile[] smallPicFile,HttpServletRequest request) throws IOException {
    //把数组里的每一个文件重命名并添加到新的集合中
    List<String> bigPic = new ArrayList<>();
    List<String> smallPic = new ArrayList<>();
    for (int i = 0; i < bigPicFile.length; i++) {
        String originalFilename = bigPicFile[i].getOriginalFilename();
        String realPath = request.getServletContext().getRealPath("/img/product/rimage");
        String fileName = UUID.randomUUID().toString().replace("-", "")+originalFilename.substring(originalFilename.lastIndexOf('.'));
        //如果文件夹不存在创建文件夹
        File imgs = new File(realPath);
        if (!imgs.exists()){
            imgs.mkdirs();
        }
        //添加文件
        bigPicFile[i].transferTo(new File(imgs,fileName));
        bigPic.add("img/product/rimage/"+fileName);
    }
    for (MultipartFile multipartFile : smallPicFile) {
        String originalFilename = multipartFile.getOriginalFilename();
        String realPath = request.getServletContext().getRealPath("/img/product/rimage");
        String fileName = UUID.randomUUID().toString().replace("-", "")+originalFilename.substring(originalFilename.lastIndexOf('.'));
        //如果文件夹不存在创建文件夹
        File imgs = new File(realPath);
        if (!imgs.exists()){
            imgs.mkdirs();
        }
        //添加文件
        multipartFile.transferTo(new File(imgs,fileName));
        smallPic.add("img/product/rimage/"+fileName);
    }
    //到此得到了两个新的存有图片路径的集合,遍历集合把值赋给每一个实体或表格,要先判断那个集合长度更大,使用大的那个次数
    int length=bigPic.size()>=smallPic.size()?bigPic.size():smallPic.size();
    if (bigPic.size()>=smallPic.size()){
        int num = bigPic.size()-smallPic.size();
        for (int i = 0; i < num; i++) {
            smallPic.add(null);
        }
    }else{
        int num = smallPic.size()-bigPic.size();
        for (int i = 0; i < num; i++) {
            bigPic.add(null);
        }
    }
    List<RouteImg> list = new ArrayList<>();
    for (int i = 0; i <length; i++) {
        RouteImg routeImg = new RouteImg();
        routeImg.setRid(rid);
        routeImg.setBigPic(bigPic.get(i));
        routeImg.setSmallPic(smallPic.get(i));
        list.add(routeImg);
    }
    routeImgService.updateImages(rid,list);
    return "redirect:/route/list";
}
@Service
public class RouteImgServiceImpl implements RouteImgService {
    @Resource
    private RouteImgMapper routeImgMapper;
    @Override
    @Transactional
    public void updateImages(Integer rid, List<RouteImg> list) {
        routeImgMapper.delete(Wrappers.<RouteImg>query().eq("rid",rid));
        for (RouteImg routeImg : list) {
            routeImgMapper.insert(routeImg);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔◎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值