bootstrap fileupload插件实现文件上传与前端回显图片


图片来源百度图库


Hi,I’am EverdayForCode. Had you learnt today!

1.下载插件依赖

bootstrap_fileupload插件依赖bootstrap,在引入插件的同时也需要引入bootstrap。

bootstrap:点击下载
bootstrap_fileupload:点击下载

2.插件引入

    <link href="../../static/lib/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
    <link href="../../static/lib/btsp-fileinput/css/fileinput.min.css" rel="stylesheet" type="text/css" />
    <link href="../../static/lib/btsp-fileinput/css/fileinput-rtl.min.css" rel="stylesheet" type="text/css" />


    <script src="../../static/js/jquery-3.1.1.min.js"></script>
 
    <script type="text/javascript" src="../../static/lib/bootstrap/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="../../static/lib/btsp-fileinput/js/fileinput.min.js"></script>
    <script type="text/javascript" src="../../static/lib/btsp-fileinput/js/locales/zh.js"></script>

值得注意的是: fileupload也依赖jQuery,在引入fileupload前应该先引入jQuery。

3.构造fileupload控件

<!--图片回显区域-->
<div class="pic_display">
</div>

<!--控件-->
<div class="container-fluid">
        <form id="form" action="upload/insert" method="post" enctype="multipart/form-data">
            <div class="row form-group">
                <label class="col-md-4">图片上传:</label>
                <div class="col-sm-12">
                    <input id="input-id" name="file" multiple type="file" data-show-caption="true">
                </div>
            </div>
        </form>
    </div>

4.初始化控件

<script type="text/javascript">
    function initFileInput(ctrlName) {
        var control = $('#' + ctrlName);
        control.fileinput({
            language: 'zh', //设置语言
            uploadUrl: "http://resource.natapp1.cc/upload_file", //上传的地址
            allowedFileExtensions: ['jpg', 'gif', 'png','mp4'],//接收的文件后缀
            //uploadExtraData:{"id": 1, "fileName":'123.mp3'},
            uploadAsync: false, //默认异步上传
            showUpload: true, //是否显示上传按钮
            showRemove : true, //显示移除按钮
            showPreview : true, //是否显示预览
            showCaption: true,//是否显示标题
            browseClass: "btn btn-primary", //按钮样式
            dropZoneEnabled: true,//是否显示拖拽区域
            minImageWidth: 50, //图片的最小宽度
            minImageHeight: 50,//图片的最小高度
            maxImageWidth: 1000,//图片的最大宽度
            maxImageHeight: 1000,//图片的最大高度
            maxFileSize: 0,//单位为kb,如果为0表示不限制文件大小
            minFileCount: 0,
            maxFileCount: 10, //表示允许同时上传的最大文件个数
            enctype: 'multipart/form-data',
            validateInitialCount:true,
            previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",
            msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
            window:true,
            uploadExtraData: function(previewId, index) {   //额外参数的关键点,没有额外参数可以注释掉
                data = {
                    uId:uId
                }
                return data;
            }

        }).on('filepreupload', function(event, data, previewId, index) {     //一个上传中处理函数
            var form = data.form, files = data.files, extra = data.extra,
                response = data.response, reader = data.reader;
            console.log('文件正在上传');
        }).on("fileuploaded", function (event, data, previewId, index) {    //一个文件完成处理函数
        	//后端下载数据成功后返回前端文件路径,前端解析路径进行文件回显(图片可使用img标签,视频可以使用视频播放插件,这里演示的是图片回显)
            var htmlStr = ''
            htmlStr +=  '<img class="fileUrls" src="'+data.response.data+'" alt="">';
            $(".pic_display").append(htmlStr);
            console.log('文件上传成功+++++!'+data);

        }).on('fileerror', function(event, data, msg) {  //一个文件上传失败处理函数
            console.log('文件上传失败!'+data.id);


        })
    }
    
    $(function () {
        initFileInput("input-id");
    })
</script>

5.完整html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link href="../../static/lib/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
    <link href="../../static/lib/btsp-fileinput/css/fileinput.min.css" rel="stylesheet" type="text/css" />
    <link href="../../static/lib/btsp-fileinput/css/fileinput-rtl.min.css" rel="stylesheet" type="text/css" />


    <script src="../../static/js/jquery-3.1.1.min.js"></script>
 
    <script type="text/javascript" src="../../static/lib/bootstrap/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="../../static/lib/btsp-fileinput/js/fileinput.min.js"></script>
    <script type="text/javascript" src="../../static/lib/btsp-fileinput/js/locales/zh.js"></script>
    <title>fileload</title>
    <style>
        .pic_display img{
            width: 100%;
        }
    </style>
</head>
<body>
<div>
	   <!--图片回显区域-->
	<div class="pic_display">
	</div>

	<!--控件-->
	
	<div class="container-fluid">
	        <form id="form" action="http://resource.natapp1.cc/upload_file" method="post" enctype="multipart/form-data">
	            <div class="row form-group">
	                <label class="col-md-4">图片上传:</label>
	                <div class="col-sm-12">
	                    <input id="input-id" name="file" multiple type="file" data-show-caption="true">
	                </div>
	            </div>
	        </form>
	</div>
</div>
<script type="text/javascript">
    function initFileInput(ctrlName) {
        var control = $('#' + ctrlName);
        control.fileinput({
            language: 'zh', //设置语言
            uploadUrl: "http://resource.natapp1.cc/upload_file", //上传的地址
            allowedFileExtensions: ['jpg', 'gif', 'png','mp4'],//接收的文件后缀
            //uploadExtraData:{"id": 1, "fileName":'123.mp3'},
            uploadAsync: false, //默认异步上传
            showUpload: true, //是否显示上传按钮
            showRemove : true, //显示移除按钮
            showPreview : true, //是否显示预览
            showCaption: true,//是否显示标题
            browseClass: "btn btn-primary", //按钮样式
            dropZoneEnabled: true,//是否显示拖拽区域
            minImageWidth: 50, //图片的最小宽度
            minImageHeight: 50,//图片的最小高度
            maxImageWidth: 1000,//图片的最大宽度
            maxImageHeight: 1000,//图片的最大高度
            maxFileSize: 0,//单位为kb,如果为0表示不限制文件大小
            minFileCount: 0,
            maxFileCount: 10, //表示允许同时上传的最大文件个数
            enctype: 'multipart/form-data',
            validateInitialCount:true,
            previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",
            msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
            window:true,
            uploadExtraData: function(previewId, index) {   //额外参数的关键点,没有额外参数可以注释掉
                data = {
                    //uId:uId
                }
                return data;
            }

        }).on('filepreupload', function(event, data, previewId, index) {     //一个上传中处理函数
            var form = data.form, files = data.files, extra = data.extra,
                response = data.response, reader = data.reader;
            console.log('文件正在上传');
        }).on("fileuploaded", function (event, data, previewId, index) {    //一个文件完成处理函数
        	//后端下载数据成功后返回前端文件路径,前端解析路径进行文件回显(图片可使用img标签,视频可以使用视频播放插件,这里演示的是图片回显)
            var htmlStr = ''
            htmlStr +=  '<img class="fileUrls" src="'+data.response.data+'" alt="">';
            $(".pic_display").append(htmlStr);
            console.log('文件上传成功+++++!'+data);

        }).on('fileerror', function(event, data, msg) {  //一个文件上传失败处理函数
            console.log('文件上传失败!'+data.id);


        })
    }
    
    $(function () {
        initFileInput("input-id");
    })
</script>
</body>
</html>

6.java文件处理

public class FileUtil {

    private static String filePath = "D:\\test";

    public static Map<String,String> upload(MultipartFile file) {

        Map<String,String> map = new HashMap<String ,String>();

        //获取文件后缀名
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        log.info("后缀名" + suffix);

        //随机生成上传文件名
        String randomFileName = ""+ UUID.randomUUID();
        String path = filePath + "\\" + randomFileName +suffix;
        String fileName = randomFileName+suffix;
        File dest = new File(path);
        map.put("path",path);
        map.put("fileName",fileName);

        //上传文件
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs();
        }

        try {
            file.transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return map;
    }
}

对应的controller我就不在写了,核心是文件处理类
值得注意:
后端不能直接返回磁盘的真实路径,这样会被浏览器拦截导致无法访问资源。应该做一下磁盘路径的虚拟映射。

7.spring boot 配置虚拟路径映射

静态资源访问配置

@Configuration
@EnableWebMvc
public class StaticResourceConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }

}

内置tomcat虚拟文件映射路径
访问项目外的文件需要配置如下:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/image/**").addResourceLocations("file:C:/image/");
    }

}

8.插件集成效果

在这里插入图片描述

参考资料:
岁月如歌,往事如风
SpringBoot 常用配置 静态资源访问配置/内置tomcat虚拟文件映射路径 - 程序猿小码 - 博客园
Bootstrap FileInput中文API整理
SpringMVC + bootstrap fileupload 多文件上传
bootstrap fileupload 使用详解

写在后面:集成文件上传插件参考了许多大佬的博客,感谢以上大佬博文。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值