Layui 上传图片以图片展示 文件以文件列表展示 (进阶)

 之前写过一篇上传文件以及图片 都以文件列表展示 今天进阶 图片以图片展示 文件还以文件列表展示 都可进行删除 点击文件名称下载文件  (代码坑能有点冗余,临时赶项目写的 我会注释详细点 大家能看懂就可以简化一下) 上面是效果图

//html代码
<div class="layui-form-item" style="width:calc(100% - 55px)">
	<label class="layui-form-label">上传附件:</label>
	<div class="layui-upload-drag upload-content" id="uploadFileMaterial">
		<i class="layui-icon"></i>
		<p>点击上传,或将文件拖拽到此处</p>
	</div>
</div>
<div class="layui-form-item" style="margin-left: 160px;">
	<!-- 图片展示区域 -->
	<div class="imageDataEcho" style="width: 660px;">
	</div>

	<!-- 文件列表展示区域 -->
	<div class="fileDataEcho">
	</div>
</div>
// 定义文件上传数组
var uploadedFiles = []; // 保存上传文件信息的数组
var uploadedImages = []; // 保存上传成功的图片信息的数组
// 合并后的最终提交数组
var finalUploadArray = [];

var file = ''
//自定义的字段
var uploadFileType = ''
//这两个是定义的字段用来方便下面函数能获取到需要的字段
var fileIndex = ''
var fileResult = ''
layui.use('upload', function () {
    var upload = layui.upload;
    //执行上传组件 1
    upload.render({
        elem: '#uploadFileMaterial',
        url: uploadFile,
        before: function (obj) {
            // 预读本地文件示例,不支持ie8
            obj.preview(function (index, file, result) {
//获取字段 赋予全局
                fileAAA = file
                fileIndex = index
                fileResult = result
                console.log(index, file, result);
                // 判断是否为图片类型
                if (/^image\/(jpeg|png|gif|bmp|jpg)$/i.test(file.type) || /\.(jpg|jpeg|png|gif|bmp)$/i.test(file.name)) {
                    uploadFileType = 'image'
                } else {
                    uploadFileType = 'file'
                }
            });
        },
        accept: "file",
        headers: {
            'dm-authorize-token': $.cookie("token"),
        },
        done: function (res) {
            console.log(fileAAA);
//如果上传文件为文件 拿到数据生成元素 并添加到文件数组中
            if (uploadFileType == "file") {
                // 创建展示文件名称和删除按钮的元素容器
                var fileElement = $('<div class="file-item">' + fileAAA.name + '<a class="delete-btn" data-file-name="' + fileAAA.name + '">X</a></div>');
                // 为文件元素添加文件链接属性
                fileElement.attr('data-file-url', res.msg);
                // 将文件容器添加到指定位置
                $('.fileDataEcho').append(fileElement);
                // 是其他类型文件
                var item = {
                    type: 'file',
                    fileName: fileAAA.name,
                    fileUrl: res.msg
                };
                // 将文件信息添加到数组中
                uploadedFiles.push(item);
                console.log('上传文件', uploadedFiles);
//如果上传文件为图片拿到数据生成元素 并添加到图片数组中
            } else if (uploadFileType == "image") {
                // 是图片类型
                var imgElement = $('<div class="image-item" style="max-width: 100px; max-height: 100px; margin-right: 10px; display: inline-block;position:relative"><img src="' + fileResult + '" alt="图片" style="max-width: 100px; max-height: 100px; margin-right: 10px;"><a class="delete-btn2" style="position: absolute;top: 5px;right: 5px;cursor: pointer; " data-index="' + fileIndex + '">X</a></div>');
                $('.imageDataEcho').append(imgElement);

                // 将图片信息添加到数组中
                uploadedImages.push({
                    type: 'image',
                    fileName: fileAAA.name,
                    fileUrl: res.msg
                });
                console.log('上传图片', uploadedImages);
            }
        },
        error: function () {
            //请求异常回调
        }
    });
});
// 渲染文件列表  //这个是回显数据的时候 将包含文件和图片的数组赋予finalUploadArray 然后循环将对应的内容生成到不同位置 并push到数组 
function renderFileList() {
    $('.fileDataEcho').empty(); // 清空文件列表
    $('.imageDataEcho').empty(); // 清空图片列表

    // 遍历上传文件数组
    finalUploadArray.forEach(function (file) {
        if (file.type == 'file') {
            // 创建展示文件名称和删除按钮的元素容器
            var fileElement = $('<div class="file-item">' + file.fileName + '<a class="delete-btn" data-file-name="' + file.fileName + '">X</a></div>');
            // 为文件元素添加文件链接属性
            fileElement.attr('data-file-url', file.fileUrl);
            // 将文件容器添加到指定位置
            $('.').append(fileElement);
            uploadedFiles = [];
            uploadedFiles.push(file)
        } else if (file.type == 'image') {
            var imgElement = $('<div class="image-item" style="max-width: 100px; max-height: 100px; margin-right: 10px; display: inline-block;position:relative"><img src="' + uploadFileUrl + file.fileUrl + '" alt="图片" style="max-width: 100px; max-height: 100px; margin-right: 10px;"><a class="delete-btn2" style="position: absolute;top: 5px;right: 5px;cursor: pointer; " data-index="' + file + '">X</a></div>');
            $('.imageDataEcho').append(imgElement);
            uploadedImages = [];
            uploadedImages.push(file)
        }
    });
}
// 点击事件监听删除文件
$('.fileDataEcho').on('click', '.delete-btn', function () {
    // 阻止事件传播,防止触发文件链接的点击事件
    event.stopPropagation();

    // 找到对应的文件容器并删除
    var fileContainer = $(this).parent();
    fileContainer.remove();

    // 获取绑定的文件名数据
    var fileName = $(this).data('file-name');
    uploadedFiles = uploadedFiles.filter(function (file) {
        return file.fileName !== fileName;
    });
    console.log('删除文件', uploadedFiles);
});

// 点击事件监听删除图片
$('.imageDataEcho').on('click', '.delete-btn2', function () {
    // 找到对应的图片容器并删除
    var imageContainer = $(this).parent();
    imageContainer.remove();

    // 获取绑定的图片索引数据
    var index = $(this).data('index');
    uploadedImages.splice(index, 1);
    console.log('删除图片', uploadedImages);
});
// 点击事件监听打开链接
$('.fileDataEcho').on('click', '.file-item', function () {
    // 判断点击的元素是否是删除按钮,如果是则不进行打开链接操作
    if (!$(event.target).is('.delete-btn')) {
        // 获取文件链接 判断文件是不是txt格式如果时txt文件,都用common.js 的download方法下载,不在浏览器打开(会乱码)
        var fileUrl = $(this).attr('data-file-url');
        if (fileUrl.indexOf(".txt") != -1) {
            download(uploadFileUrl + fileUrl, fileUrl);
        } else {
            // 在新标签页中打开链接
            window.open(uploadFileUrl + fileUrl, '_blank');
        }
    }
});

提交数据的时候将文件和图片数组合并成一个

后台需要的字段 = [...uploadedFiles, ...uploadedImages]

回显的时候 拿到后台包含图片和文件的数组赋予上面定义的总数组

  finalUploadArray = e.data.attachment

后面下载数据但是还有点bug 现在也给大家伙排坑  // 获取文件链接 判断文件是不是txt格式如果时txt文件,都用common.js 的download方法下载,不在浏览器打开(会乱码)

     // 获取文件链接 判断文件是不是txt格式如果时txt文件,都用common.js 的download方法下载,不在浏览器打开(会乱码)
        var fileUrl = $(this).attr('data-file-url');
        if (fileUrl.indexOf(".txt") != -1) {
            download(uploadFileUrl + fileUrl, fileUrl);
        } else {
            // 在新标签页中打开链接
            window.open(uploadFileUrl + fileUrl, '_blank');
        }

上面的注释写的很清楚了 在这就不解释了 最后大家记得在每次使用完(提交完表单什么什么的)记得清除文件和图片所在位置的所有元素 和 清空包含数据的数组

// 取消
function cancelProjectBtn() {
    projectId = "";
    layer.closeAll();
    // 重置上传文件
    uploadedFiles = []
    $('.fileDataEcho').empty(); // 清空文件列表
    // 重置上传图片
    uploadedImages = []
    $('.imageDataEcho').empty(); // 清空图片列表
//清空搜索条件
    $("#searchStatus").val('');
    $("#searchKey").val(''),
//重新获取表格数据
        initUploadTable()
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将文件上传到MySQL数据库,需要先将文件转换成二进制数据,然后将其插入到数据库中的BLOB类型字段中。以下是使用Layui上传图片并将其存入MySQL数据库的示例: 1. 在HTML中添加文件上传表单: ```html <form class="layui-form" action="" enctype="multipart/form-data"> <div class="layui-form-item"> <div class="layui-upload"> <button type="button" class="layui-btn" id="uploadBtn">上传图片</button> <div class="layui-upload-list"> <img class="layui-upload-img" id="previewImg"> <p id="previewText"></p> </div> </div> </div> </form> ``` 2. 引入Layui和jQuery库: ```html <link rel="stylesheet" href="https://cdn.staticfile.org/layui/2.5.6/css/layui.min.css"> <script src="https://cdn.staticfile.org/jquery/3.5.1/jquery.min.js"></script> <script src="https://cdn.staticfile.org/layui/2.5.6/layui.min.js"></script> ``` 3. 初始化Layui上传组件: ```javascript layui.use('upload', function(){ var upload = layui.upload; //执行上传 var uploadInst = upload.render({ elem: '#uploadBtn', //绑定元素 url: '/upload/', //上传接口 accept: 'images', //允许上传的文件类型 size: 1024, //限制文件大小,单位KB done: function(res){ //上传成功回调 $('#previewImg').attr('src', res.data.src); //显示预览图 $('#previewText').html(res.data.title); //显示文件名 //将文件二进制数据存入数据库 $.ajax({ type: 'POST', url: '/saveToDB/', data: { imageData: res.data.imageData //文件的二进制数据 }, success: function(data){ console.log(data); }, error: function(){ console.log('上传失败'); } }); }, error: function(){ //上传失败回调 console.log('上传失败'); } }); }); ``` 4. 在服务器端处理上传的文件,并将其存入MySQL数据库: ```php <?php //获取上传的文件二进制数据 $imageData = file_get_contents($_FILES['file']['tmp_name']); //连接MySQL数据库 $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "dbname"; $conn = new mysqli($servername, $username, $password, $dbname); //将文件二进制数据插入到数据库中 $stmt = $conn->prepare("INSERT INTO images (image_data) VALUES (?)"); $stmt->bind_param("b", $imageData); $stmt->execute(); $stmt->close(); $conn->close(); ?> ``` 注意:以上代码仅供参考,具体实现需要根据自己的实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值