element-ui文件上传下载组件+后台对应接口

这篇具有很好参考价值的文章主要介绍了element-ui文件上传下载组件+后台对应接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

element-ui文件上传下载组件:
具备上传、下载和删除功能。
不自动上传,附件选择后只将文件加入待上传列表,点击确认上传按钮后上传到后台服务器,已上传的文件通过表格的形式展示在上方表格中。
删除和上传权限可配置。
效果如下:
elementui下载文件,vue.js,elementui
elementui下载文件,vue.js,elementui
elementui下载文件,vue.js,elementui

代码如下:

/*
 * @Description: element-ui文件上传下载组件(不自动上传)
 * @Author: yiwenli
 * @Date: 2023-03-30
 */
Vue.component('fileUpload', {
    name: 'fileUpload',
    template: /* html */ `<div>
        <div>已上传文件列表</div>
        <el-table :data="uploadedFileList" :show-header="false">
                <el-table-column prop="fileName" width="300" align="center"></el-table-column>
                <el-table-column prop="operate" width="200" align="center">
                    <template slot-scope="scope">
                        <el-button class="el-icon-download" type="text" @click="fileDownload(scope.row)">下载</el-button>
                        <el-button class="el-icon-delete" type="text" @click="fileDeleteInServer(scope.row)" v-if="deleteAble">删除</el-button>
                    </template>
                </el-table-column>
        </el-table>
		<el-form-item v-if="uploadAble">
			<el-upload
                action="#"
                :auto-upload="false"
				:multiple="true"
                :file-list="toUploadFileList"
                :on-change="fileChange"
                :on-remove="fileRemove"
                >
                    <el-button slot="trigger" size="small" type="primary">附件选择</el-button>
                    <el-button size="small" plain @click="fileUpload">确认上传</el-button>
			</el-upload>
		</el-form-item>
	</div>`,
    props: {
        // 原始文件数据
        fileList: {
            type: Array,
            required: true,
            default: () => [],
        },
        // 上传功能是否可用
        uploadAble: {
            type: Boolean,
            required: false,
            default: true,
        },
        // 删除功能是否可用
        deleteAble: {
            type: Boolean,
            required: false,
            default: true,
        },
    },
    data() {
        return {
            // 已上传文件列表
            uploadedFileList: [],
            // 待上传文件列表
            toUploadFileList: [],
        };
    },
    computed: {
        // 上传路径
        uploadUrl() {
            return requestUrlBase('/file/fileUpload');
        },
        // 删除路径
        deleteUrl() {
            return requestUrlBase('/file/deleteFile');
        },
        // 下载路径
        downloadUrl() {
            return requestUrlBase('/file/downLoadFile');
        },
    },
    watch: {
        uploadedFileList() {
            this.$emit('update:fileList', this.uploadedFileList);
        },
        fileList() {
            this.uploadedFileList = this.fileList;
        },
    },
    created() {
        this.uploadedFileList = this.fileList;
    },
    methods: {
        /**
         * 文件上传
         */
        fileUpload() {
            if (this.toUploadFileList.length === 0) {
                this.$message.error('请先选择至少1个文件再上传');
                return;
            }
            let formData = new FormData();
            this.toUploadFileList.forEach((item) => {
                formData.append('file', item.raw);
            });
            $http({
                url: this.uploadUrl,
                method: 'post',
                data: formData,
                headers: { 'Content-Type': 'multipart/form-data' },
            })
                .then(({ data }) => {
                    // 1、更新已上传文件列表
                    this.uploadedFileList = this.uploadedFileList.concat(data);
                    // 2、更新待上传文件列表
                    let returnFileMap = new Map(data.map((value) => [value.fileName, value.fileId]));
                    this.toUploadFileList = this.toUploadFileList
                        .filter((item) => !returnFileMap.has(item.name))
                        .map((item) => {
                            item.status = 'error';
                            return item;
                        });
                    this.$message.success('附件上传完成');
                })
                .catch((e) => {
                    this.$message.error(e.message || '附件上传失败');
                });
        },
        /**
         * 文件修改
         * @param {*} file     当前操作文件对象
         * @param {*} fileList 文件列表
         */
        fileChange(file, fileList) {
            this.toUploadFileList = fileList;
        },
        /**
         * 文件删除
         * @param {Object} file    当前操作文件对象
         * @param {Array} fileList 文件列表
         */
        fileRemove(file, fileList) {
            this.toUploadFileList = fileList;
        },
        /**
         * 文件从服务器端删除
         * @param {Object} file 文件对象
         */
        fileDeleteInServer(file) {
            this.$confirm('确定删除?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning',
            })
                .then(() => {
                    $http({
                        url: this.deleteUrl,
                        method: 'get',
                        params: requestParam(file, 'get'),
                        headers: {
                            'Content-Type': 'application/x-www-form-urlencoded',
                        },
                    })
                        .then(() => {
                            this.$message.success('文件删除成功');
                            this.uploadedFileList.splice(
                                this.uploadedFileList.findIndex((item) => item.fileId === file.fileId),
                                1
                            );
                        })
                        .catch((e) => {
                            this.$message.error(e.message || '文件删除失败');
                        });
                })
                .catch(() => {
                    this.$message({
                        type: 'info',
                        message: '已取消删除',
                    });
                });
        },
        /**
         * 文件下载
         * @param {Object} file 文件对象
         */
        fileDownload(file) {
            let params = {
                fileId: file.fileId,
                fileName: file.fileName,
                userOrgId: Session.get('userInfo').orgId,
            };
            this.postDownloadFile(params, this.downloadUrl);
        },
        /**
         * 以post方式传参并下载文件
         * @param {Object} params 请求需要的参数
         * @param {String} url 请求url地址
         */
        postDownloadFile(params, url) {
            // params是post请求需要的参数,url是请求url地址
            const form = document.createElement('form');
            form.style.display = 'none';
            form.action = url;
            form.method = 'post';
            document.body.appendChild(form);
            // 动态创建input并给value赋值
            for (const key in params) {
                const input = document.createElement('input');
                input.type = 'hidden';
                input.name = key;
                input.value = params[key];
                form.appendChild(input);
            }
            form.submit();
            form.remove();
        },
    },
});

<file-upload
     :file-list.sync="fileList"
     :upload-able="true"
     :delete-able="true"
></file-upload>

后端:文章来源地址https://www.toymoban.com/news/detail-527313.html

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.ieslab.model.Result;
import com.ieslab.pfjawebsvr.modules.file.domain.FileVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.*;

/**
 * @author
 * @ClassName FileOpController
 * @Description 附件上传下载
 * @date 2022年03月16日 14:20
 */
@Api(tags = "附件上传下载")
@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {

    @ApiOperation("附件上传")
    @PostMapping("/fileUpload")
    public Result upLoadFile(@RequestHeader("userOrgId") String userOrgId, @RequestParam("file") MultipartFile[] files) {
        if (files.length == 0) {
            return Result.error("文件为空");
        }
        if (ObjectUtil.isNull(userOrgId)) {
            userOrgId = "null";
        }
        List<FileVO> fileVOList = new ArrayList<>();
        try {
            String basePath = System.getenv("PFJA_HOME") + "/file/" + userOrgId + "/";
            for (MultipartFile multipartFile : files) {
                String fileName = multipartFile.getOriginalFilename();
                //生成文件唯一has256值
                String hashValue = DigestUtil.sha256Hex(multipartFile.getBytes());
                String filePath = basePath + FileNameUtil.getPrefix(fileName) + "&" + hashValue + "." + FileNameUtil.getSuffix(fileName);
                File file = FileUtil.file(filePath);
                //实现文件存储
                FileUtil.writeBytes(multipartFile.getBytes(), file);
                fileVOList.add(new FileVO(hashValue, fileName));
            }
            return Result.ok(fileVOList);
        } catch (Exception e) {
            return Result.error(e.getMessage());
        }
    }

    @ApiOperation("附件下载")
    @PostMapping(value = "/downLoadFile")
    public void downLoadFile(@RequestParam("userOrgId") String userOrgId, @RequestParam("fileId") String fileId, @RequestParam("fileName") String fileName, HttpServletResponse response) {
        if (ObjectUtil.isNull(userOrgId)) {
            userOrgId = "null";
        }
        String basePath = System.getenv("PFJA_HOME") + "/file/" + userOrgId + "/";
        try {
            // 创建输出流对象
            ServletOutputStream outputStream = response.getOutputStream();
            //以字节数组的形式读取文件
            String filePath = basePath + FileNameUtil.getPrefix(fileName) + "&" + fileId + "." + FileNameUtil.getSuffix(fileName);
            byte[] bytes = FileUtil.readBytes(filePath);
            // 设置返回内容格式
            response.setContentType("application/octet-stream");
            // 把文件名按UTF-8取出并按ISO8859-1编码,保证弹出窗口中的文件名中文不乱码
            // 中文不要太多,最多支持17个中文,因为header有150个字节限制。
            // 这一步一定要在读取文件之后进行,否则文件名会乱码,找不到文件
            fileName = new String(fileName.getBytes("UTF-8"), "UTF-8");
            // 设置下载弹窗的文件名和格式(文件名要包括名字和文件格式)
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 返回数据到输出流对象中
            outputStream.write(bytes);
            // 关闭流对象
            IoUtil.close(outputStream);
        } catch (Exception e) {
            Result.error(e.getMessage());
        }
    }

    @ApiOperation("附件删除")
    @GetMapping("/deleteFile")
    public Result deleteFile(@RequestHeader("userOrgId") String userOrgId, @RequestParam("fileId") String fileId, @RequestParam("fileName") String fileName) {
        String basePath = System.getenv("PFJA_HOME") + "/file/" + userOrgId + "/";
        String filePath = basePath + FileNameUtil.getPrefix(fileName) + "&" + fileId + "." + FileNameUtil.getSuffix(fileName);
        File file = FileUtil.file(filePath);
        if (file.exists()) {
            boolean delete = file.delete();
            return Result.ok(delete);
        } else {
            return Result.ok(true);
        }
    }
}

到了这里,关于element-ui文件上传下载组件+后台对应接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue element el-upload附件上传、在线预览、下载当前预览文件

    上传 在线预览(iframe): payload: response: 全部代码: 初版–01

    2024年02月14日
    浏览(58)
  • element-ui图像组件、上传组件、分页组件

    el-image:保留了原生的img的属性 1、导航方向:通过mode属性设置 2、菜单项 示例: (1)使用elementUI的上传组件将图片上传到服务器并保存到数据库中 (2)在el-table控件中将上传的图片显示出来 实现过程: (1)给数据库中的数据表增加一列(image_url):保存图片在服务器中

    2024年02月07日
    浏览(43)
  • element-ui upload图片上传组件使用

    图片上传前端收集 数据 再调用接口发送到后端 组件标签内的参数: 参数 说明 类型 可选值 默认值 action 必选参数,上传的地址 string — — headers 设置上传的请求头部 object — — multiple 是否支持多选文件 boolean — — data 上传时附带的额外参数 object — — name 上传的文件字段

    2023年04月19日
    浏览(43)
  • 基于element-ui封装上传图片到腾讯云Cos组件

    组件需求 上传图片到腾讯云Cos服务器 可以显示传入的图片地址 可以删除传入的图片地址 可以上传图片到云服务器 上传到腾讯云之后,可以返回图片地址,显示 上传成功之后,可以回调成功函数 需要使用借助一个插件,帮助我们上传图片资源到腾讯云Cos 使用element的el-upl

    2023年04月17日
    浏览(91)
  • vue项目element-ui上传组件自定义方法无法获取进度

    原因:element-ui中的up-load组件使用时,若用自定义上传http-request,会重新申明XMLHttpRequest,on-progress里的申明则被覆盖,无法使用该钩子,无法添加进度条 方案一:假进度条;写个假进度条优化用户体验,使用el-upload组件里on-change方法的status状态,配合定时器 ,以vue3为例 ,

    2024年02月15日
    浏览(52)
  • element-ui上传文件 + 携带参数案例

     js逻辑代码 失败响应的数据: 成功响应的数据:     参考文章 :https://www.cnblogs.com/lvhanghmm/p/15038986.html

    2024年02月05日
    浏览(33)
  • Element-ui upload 手动上传文件

    (随手一发,可以拿过来就用,不做解释看不懂的可以照搬,👇代码可复制👇)    

    2024年02月11日
    浏览(37)
  • Element-UI的Upload 上传文件

    \\\"element-ui\\\": \\\"^2.15.9\\\" Upload 上传官方文档 2.1 自动上传 限制一次只能上传一个文件,并判断上传的文件大小及文件类型; 自动上传:即选择文件后即开始校验,校验通过后调接口上传到服务器 2.2 手动上传 限制一次只能上传一个文件,并判断上传的文件大小及文件类型; 手动上

    2024年02月11日
    浏览(37)
  • 【element-ui组件】一.图像组件;二.导航菜单(NavMenu);三.上传组件:Upload;四.分页组件

    目录 一.图像组件 二.导航菜单(NavMenu) 1.导航方向:通过model属性来设置 2.菜单项: 三.上传组件:Upload 四.分页组件 1.实现分页的方式: (1)服务器端分页:通过底层的数据库来实现,前端会频繁的和服务器交互,客户端每次请求的是分页的数据而不是所有数据

    2023年04月24日
    浏览(50)
  • 使用element-ui的Upload 上传文件

    使用Upload 进行文件上传 https://element.eleme.cn/#/zh-CN/component/upload 注:当文件和一些其他数据(姓名,年龄)进行一起上传时候可分为两种过程 第一种:单独的文件上传地址,上传完文件后,后端返回该文件的地址,前端将该地址同其他数据(姓名,年龄)再次上传。 第二种:

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包