Layui多图上传

Layui多图上传

最近制作经销商上传附件需要实现一个多图上传的功能,前端使用的是layui框架支持多张图片上传,效果如下
在这里插入图片描述
前端页面代码:

     <!--图片上传组件-->
      <div class="layui-form-item">
        <div class="layui-input-block">
          <div id="imgContentForEdit">
            <input type="hidden" id="attachListForEdit" name="attachList"/>
            <div class="layui-form-item">
              <table class="layui-table">
                <thead>
                <tr>
                  <th>文件名</th>
                  <th>状态</th>
                  <th>操作</th>
                </tr>
                </thead>
                <tbody id="demoListForEdit"></tbody>
              </table>
            </div>
          </div>

          <div class="layui-input-inline">
            <button type="button" id="uploadForEdit" class="layui-btn layui-btn-primary">
              点击选择
            </button>
          </div>
          <div class="layui-input-inline">
            <button type="button" id="uploadActionForEdit" class="layui-btn layui-btn-primary">
              <i class="layui-icon"></i>开始上传
            </button>
          </div>
        </div>
      </div>

使用前需引入layui相关的js、css文件:


<link rel="stylesheet" href="//res.layui.com/layui/dist/css/layui.css"  media="all">
<script src="//res.layui.com/layui/dist/layui.js" charset="utf-8"></script>
<!-- 注意:如果你直接复制所有代码到本地,上述js、css路径需要改成你本地的 -->

js核心代码

;layui.define(['jquery', 'table', 'form', 'layer', 'laydate', 'upload'], function (exports) {
  "use strict";
  var $ = layui.$, table = layui.table, layer = layui.layer, laydate = layui.laydate,
    upload = layui.upload, form = layui.form, admin = layui.admin,setter = layui.setter;

//定义请求接口
  var path = {
    uploadPic: '/merchantInfo/uploadPic',
    img:  '/readImage',
  };

  var imgList=[];
  var deleteList=[];
  //新增多文件列表示例
  var demoListView = $('#demoListForAdd');
  var  uploadListIns = upload.render({
    elem: '#uploadForAdd' ,
   url: window.ptfConfig.baseUrl + path.uploadPic,		//上传图片接口,可自行更换
    headers: { //通过 request 头传递
    Authorization: layui.data(setter.tableName)[setter.headers.accessTokenName]
  },	
    accept: 'file',
    multiple: true,
    auto: false,
    bindAction: '#uploadActionForAdd',
    choose: function(obj){
      var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
      //读取本地文件
      obj.preview(function(index, file, result){

        var tr = $(['<tr id="upload-'+ index +'">'
          ,'<td>'+ file.name +'</td>'
          ,'<td>等待上传</td>'
          ,'<td>'
          ,'<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>'
          ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>'
          ,'</td>'
          ,'</tr>'].join(''));

        //删除
        tr.find('.demo-delete').on('click', function(){
          delete files[index]; //删除对应的文件
          tr.remove();
          uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
        });

        demoListView.append(tr);
      });
    }
    ,done: function(res, index, upload){
      if(res.code == 200){ //上传成功
        //创建附件对象
            console.log(res.data)
        var attcah={};
        attcah.attachType=res.data[0].type;
        attcah.attachName=res.data[0].originalFileName;
        attcah.url=res.data[0].url;
        attcah.fileName=res.data[0].serveFileName;
        imgList.push(attcah);//加入数组
        var tr = demoListView.find('tr#upload-'+ index)
          ,tds = tr.children();
        tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>');
        tds.eq(3).html(''); //清空操作
        return delete this.files[index]; //删除文件队列已经上传成功的文件
      }
      this.error(index, upload);
    }
    ,error: function(index, upload){
      var tr = demoListView.find('tr#upload-'+ index),
        tds = tr.children();
      tds.eq(2).html('<span style="color: #FF5722;">上传失败</span>');
      tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传
    }
  });

后端控制层

import com.hrt.framework.web.core.Result;
import com.hrt.zxxc.fxspg.file.FileBean;
import com.hrt.zxxc.fxspg.file.FileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
 * MerchantInfoInfo Controller层
 *
 * @author generator
 * @version 1.0.0
 * @date 2019-06-27 17:28:12
 */
@Controller
@RequestMapping("merchantInfo")
public class PtfMerchantInfoController {

    @Autowired
    private FileService fileService;
    
    /**
     * @Param [file, request]
     * @return com.hrt.framework.web.core.Result
     * @Author youjp
     * @Description //TODO 图片上传
     * @throw
     **/
    @PostMapping(value = "uploadPic")
    @ResponseBody
    public Result uploadPic(MultipartFile[] file, HttpServletRequest request) {
        List<FileBean> filePathList = fileService.upload(request, file);
        return Result.success(filePathList);
    }
}

FileService

package com.hrt.zxxc.fxspg.file;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 * @program: fxspg
 * @description:
 * @author: youjp
 * @create: 2019-06-21 11:05
 **/
@Service
public class FileService {

    @Value("${image.uploadPath}")
    private String imageUploadPath;

    public List<FileBean> upload(HttpServletRequest request, MultipartFile[] files) {
        List<FileBean> filePath = new ArrayList<>();
        Calendar cal = Calendar.getInstance();
        try {
            for (MultipartFile file : files) {
                //todo 前端传递业务类型。判断能否上传
                String originalFilename = file.getOriginalFilename();
                String type = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."),file.getOriginalFilename().length());
                String fullFileName = System.currentTimeMillis() + type;
                String serveFileName = fullFileName.substring(0,fullFileName.lastIndexOf("."));
                String originalName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
                Calendar calendar = Calendar.getInstance();
                int year = calendar.get(Calendar.YEAR);
                int month = calendar.get(Calendar.MONTH) + 1;
                int day = calendar.get(Calendar.DAY_OF_MONTH);
                String savePath = imageUploadPath + "/"+ year + "/" + month + "/"+ day + "/" + fullFileName;
                File target = new File(savePath);
                if (!target.getParentFile().exists()) {
                    target.getParentFile().mkdirs();
                }
                file.transferTo(target);
                //信息封装
                savePath =  "/"+ year + "/" + month + "/"+ day + "/" + fullFileName;

                FileBean fileBean = new FileBean(serveFileName,originalName,savePath,type);
                //返回文件在服务器的地址
                filePath.add(fileBean);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return filePath;
    }

    public void readFile(String fileName, String folder, HttpServletRequest request, HttpServletResponse response) {

        try {
            response.setContentType("image/jpeg");
            //发头控制浏览器不要缓存
            response.setDateHeader("expries", -1);
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Pragma", "no-cache");
            String root_path = imageUploadPath + File.separator + folder + File.separator + fileName;

            ServletOutputStream outputStream = response.getOutputStream();
            FileInputStream fileInputStream = new FileInputStream(new File(root_path));
            BufferedInputStream bufferedInputStream = new BufferedInputStream(
                    fileInputStream);
            byte[] b = new byte[bufferedInputStream.available()];
            bufferedInputStream.read(b);
            outputStream.write(b);

            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void readFile(String url, HttpServletRequest request, HttpServletResponse response) {

        try {
            response.setContentType("image/jpeg");
            //发头控制浏览器不要缓存
            response.setDateHeader("expries", -1);
            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Pragma", "no-cache");
            String root_path = imageUploadPath + File.separator + url;

            ServletOutputStream outputStream = response.getOutputStream();
            FileInputStream fileInputStream = new FileInputStream(new File(root_path));
            BufferedInputStream bufferedInputStream = new BufferedInputStream(
                    fileInputStream);
            byte[] b = new byte[bufferedInputStream.available()];
            bufferedInputStream.read(b);
            outputStream.write(b);

            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

FileBean.java

package com.hrt.zxxc.fxspg.file;

/**
 * @program: hrt-component2
 * @description:
 * @author: jp
 * @create: 2019-06-21 11:18
 **/
public class FileBean {

    private String serveFileName;

    private String originalFileName;

    private String url;

    private String type;

    public FileBean(String serveFileName, String originalFileName, String url, String type) {
        this.serveFileName = serveFileName;
        this.originalFileName = originalFileName;
        this.url = url;
        this.type = type;
    }

    public FileBean() {
    }

    public String getServeFileName() {
        return serveFileName;
    }

    public void setServeFileName(String serveFileName) {
        this.serveFileName = serveFileName;
    }

    public String getOriginalFileName() {
        return originalFileName;
    }

    public void setOriginalFileName(String originalFileName) {
        this.originalFileName = originalFileName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

响应工具: Result.java

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.hrt.framework.web.core;

import com.hrt.framework.commons.utils.JsonUtils;
import com.hrt.framework.web.core.enums.ResultEnum;

public class Result {
    private int code;
    private String msg;
    private Object data;

    public Result() {
    }

    public Result(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Result(int code, String msg, Object data) {
        this.code = code;
        this.data = data;
    }

    public int getCode() {
        return this.code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return this.msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return this.data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public static Result success() {
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMsg(ResultEnum.SUCCESS.getMsg());
        return result;
    }

    public static Result success(Object data) {
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMsg(ResultEnum.SUCCESS.getMsg());
        result.setData(data);
        return result;
    }

    public static Result fail() {
        Result result = new Result();
        result.setCode(ResultEnum.FAIL.getCode());
        result.setMsg(ResultEnum.FAIL.getMsg());
        return result;
    }

    public static Result fail(Object data) {
        Result result = new Result();
        result.setCode(ResultEnum.FAIL.getCode());
        result.setMsg(ResultEnum.FAIL.getMsg());
        result.setData(data);
        return result;
    }

    public static Result internalError() {
        Result result = new Result();
        result.setCode(ResultEnum.INTERNAL_ERROR.getCode());
        result.setMsg(ResultEnum.INTERNAL_ERROR.getMsg());
        return result;
    }

    public static Result internalError(Object data) {
        Result result = new Result();
        result.setCode(ResultEnum.INTERNAL_ERROR.getCode());
        result.setMsg(ResultEnum.INTERNAL_ERROR.getMsg());
        result.setData(data);
        return result;
    }

    public static Result illegalArguments(Object data) {
        Result result = new Result();
        result.setCode(ResultEnum.ILLEGAL_ARGUMENTS.getCode());
        result.setMsg(ResultEnum.ILLEGAL_ARGUMENTS.getMsg());
        result.setData(data);
        return result;
    }

    public static Result illegalArguments() {
        Result result = new Result();
        result.setCode(ResultEnum.ILLEGAL_ARGUMENTS.getCode());
        result.setMsg(ResultEnum.ILLEGAL_ARGUMENTS.getMsg());
        return result;
    }

    public static Result missingParameter(Object data) {
        Result result = new Result();
        result.setCode(ResultEnum.MISSING_PARAMETER.getCode());
        result.setMsg(ResultEnum.MISSING_PARAMETER.getMsg());
        result.setData(data);
        return result;
    }

    public static Result forbidden() {
        Result result = new Result();
        result.setCode(ResultEnum.FORBIDDEN.getCode());
        result.setMsg(ResultEnum.FORBIDDEN.getMsg());
        return result;
    }

    public static Result custom(int code, String msg) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    public static Result custom(int code, String msg, Object data) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    public String toString() {
        return JsonUtils.toJSONString(this);
    }
}

jsonUtils工具类

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.hrt.framework.commons.utils;

import com.alibaba.fastjson.JSON;
import java.util.List;

public final class JsonUtils {
    private JsonUtils() {
    }

    public static <T> T parseObject(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

    public static <T> List<T> parseArray(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz);
    }

    public static String toJSONString(Object object) {
        return JSON.toJSONString(object);
    }

    public static String toJSONString(Object object, boolean prettyFormat) {
        return JSON.toJSONString(object, prettyFormat);
    }
}

自定义响应枚举:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.hrt.framework.web.core.enums;

public enum ResultEnum {
    SUCCESS(200, "SUCCESS"),
    FAIL(201, "FAIL"),
    ILLEGAL_ARGUMENTS(202, "ILLEGAL_ARGUMENTS"),
    MISSING_PARAMETER(203, "MISSING_PARAMETER"),
    FORBIDDEN(403, "FORBIDDEN"),
    INTERNAL_ERROR(500, "INTERNAL_ERROR");

    private int code;
    private String msg;

    private ResultEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return this.code;
    }

    public String getMsg() {
        return this.msg;
    }
}

启动类将MultipartResolver注入容器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import java.util.Collections;
@SpringBootApplication
public class PlatformApplication {

    public static void main(String[] args) {
        SpringApplication.run(PlatformApplication.class, args);
    }

	//解决跨域问题
  private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 1允许任何域名使用
        corsConfiguration.addAllowedOrigin("*");
        // 2允许任何头
        corsConfiguration.addAllowedHeader("*");
        // 3允许任何方法(post、get等)
        corsConfiguration.addAllowedMethod("*");
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }

  @Bean
  public MultipartResolver multipartResolver(){
      CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
      multipartResolver.setMaxUploadSize(10000000);
      return multipartResolver;
  }

}

application.yml文件配置图片上传保存路径:

spring:
#  profiles:
   # active: dev
  application:
    name: fxspg-platform-server
  main:
    allow-bean-definition-overriding: true
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
server:
  port: 9001

#文件上传路径
image:
  uploadPath: D:\fxspg\image
  logo: \logo
# 日志配置
logging:
  config: classpath:logback-spring.xml
  path: ./logs/${spring.application.name}
  lolevel:
    root: info


上传效果:
在这里插入图片描述
选择多张图片以后,点击开始上传。查看
D:\fxspg\image 可以看到之前选中的多张图片已经上传。
在这里插入图片描述
有兴趣的老爷,可以关注我的公众号【一起收破烂】,回复【006】获取2021最新java面试资料以及简历模型120套哦~
在这里插入图片描述

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

收破烂的小熊猫~

你的鼓励将是我创造最大的东西~

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

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

打赏作者

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

抵扣说明:

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

余额充值