首页 > 其他分享 >移动端Vue2实现文件图片上传功能

移动端Vue2实现文件图片上传功能

时间:2024-11-19 14:56:52浏览次数:1  
标签:getFileList fileName params Vue2 res let 移动 上传

基于 Vue2 + Vant2 组件库实现 :

废话不多说,直接看代码 :

主要代码 :

methods: {
        // 上传图片之前的操作
        beforeRead(file) {
            let arr = file.name.split('.');
            let fileType = '.' + arr[arr.length - 1].toLowerCase();
            const size = file.size / 1024 / 1024 > 100;
            if (this.acceptAllowFiles.includes(fileType)) {
                this.isShowFileList = true;
            } else {
                this.isShowFileList = false;
                this.isMessageTip = true;
                this.tipMessage = `不支持上传${fileType}类型的文件,请重新上传`;
                return;
            }
            if (size) {
                this.isMessageTip = true;
                this.tipMessage = '上传文件不能大于100M';
                this.uploaderList = [];
                return;
            }
            if (this.isShowFileList) {
                this.isMessageTip = false;
            }
            return true;
        },
        async afterRead(params) {
            // 创建FormData对象,上传图片需要转换二进制,这里要用到FormData
            let uploadFormData = new FormData();
            params.status = 'uploading';
            params.message = '上传中...';
            uploadFormData.append('files', params.file);
            axios
                .post('/file/uploadFile', uploadFormData, {
                    headers: {
                        'Content-Type': 'multipart/form-data',
                    },
                })
                .then((res) => {
                    let { code } = res || {};
                    if (code == '0') {
                        params.status = '';
                        params.message = '';
                        this.getFileList = res.result;
                        this.fileName = this.getFileList[0]['fileName'];
                        this.formFileData.newFileName =
                            this.getFileList[0]['newFileName'];
                        // this.quFileItem.fileObj.fileName =
                        //     this.getFileList[0]['fileName'];
                        // this.quFileItem.fileObj.newFileName =
                        //     this.getFileList[0]['newFileName'];
                        // 增加url值信息
                        // this.quFileItem.fileObj.fileUrl =
                        //     this.getFileList[0]['url'];
                        // Toast('上传成功');
                        this.saveApi();
                    } else if (code == '1') {
                        if (res.msg) {
                            let errMsg = res.msg;
                            Toast(errMsg);
                        }
                        this.uploaderList = [];
                    }
                })
                .catch((err) => {
                    params.status = 'failed';
                    params.message = '上传失败';
                    console.log(err, 'err');
                });
        },
        // 保存上传背景接口
        async saveApi() {
            let data = {
                userId: this.formFileData.userId,
                name: this.fileName,
                type: 1, // 类型
                source: 1, // 来源
                newFileName: this.formFileData.newFileName, // 图片上传的新名称
            };
            let res = await uploadBackgroundFileApi(data);
            const { code } = res;
            if (code == '0') {
                Toast('上传成功');
            } else {
                Toast.fail('保存失败');
            }
        },
        // 下载附件
        downLoadFile() {
            if (this.getFileList.length == 0) return;
            window.localStorage.href = this.getFileList[0].url;
        },
        // 删除文件
        handleRemove() {
            this.uploaderList = [];
            this.tipMessage = '';
            this.fileName = '';
        },
    },

全部代码:

<!--
  作者:小灰狼
  时间:2023-07
  描述:附件题型
-->
<template>
    <div class="file-row">
        <van-field
            name="uploader"
            :rules="[
                { required: quFileItem.isRequired, message: '请上传文件' },
            ]"
        >
            <template #input>
                <van-uploader
                    accept="*"
                    v-model="uploaderList"
                    :max-count="1"
                    :max-size="100 * 1024 * 1024"
                    :deletable="is_answered"
                    :disabled="!is_answered"
                    :before-read="beforeRead"
                    :after-read="afterRead"
                    @delete="handleRemove"
                >
                    <van-button icon="upgrade" plain type="info"
                        >上传文件</van-button
                    >
                </van-uploader>
                <span
                    style="color: #4e96ff"
                    v-if="uploaderList.length > 0"
                    @click="downLoadFile"
                    >{{ fileName }}</span
                >
                <div
                    slot="tip"
                    class="el-upload__tip"
                    style="margin: 20px auto; color: red"
                    v-show="isMessageTip"
                >
                    {{ tipMessage }}
                </div>
            </template>
        </van-field>
    </div>
</template>
 
<script>
import axios from 'axios';
import { Toast } from 'vant';
import SessionStore from '@utils/SessionStore';
import { uploadBackgroundFileApi } from '@/api';
 
export default {
    props: {
        quFileItem: {
            type: Object,
            default: null,
        },
        is_answered: {
            // 控制禁用状态
            type: Boolean,
            default: true,
        },
    },
    data() {
        return {
            fileName: '', // 上传文件名称
            // 上传文件格式
            acceptAllowFiles:
                '.png, .jpg, .jpeg, .gif, .bmp, .flv, .swf,.mkv,.avi,.rm,.rmvb,.mpeg,.mpg,.ogg,.ogv,.mov,.wmv,.mp4,.mp3,.webm,.wav,.mid,.zip,.xls, .xlsx, .doc, .docx, .rar',
            uploaderList: [], // 已上传的文件列表
            getFileList: [], // 存储已上传的文件信息
            isMessageTip: false, // 上传提示语是否展示
            tipMessage: '', // 上传提示语
            isShowFileList: false, // 是否展示文件列表
            formFileData: {
                userId: '', // 用户Id
                name: '默认',
                type: 1, // 类型
                source: 1, // 来源
                newFileName: '', // 图片上传的新名称
            },
        };
    },
    created() {
        this.formFileData.userId = SessionStore.get('userId');
        if (this.quFileItem && this.quFileItem.fileObj.fileName !== '') {
            this.isMessageTip = false;
            this.uploaderList = [
                {
                    name: this.quFileItem.fileObj?.fileName,
                    url: this.quFileItem.fileObj?.fileUrl,
                },
            ];
            this.getFileList = [{ url: this.quFileItem.fileObj?.fileUrl }];
            this.fileName = this.quFileItem.fileObj?.fileName;
        }
    },
    methods: {
        // 上传图片之前的操作
        beforeRead(file) {
            let arr = file.name.split('.');
            let fileType = '.' + arr[arr.length - 1].toLowerCase();
            const size = file.size / 1024 / 1024 > 100;
            if (this.acceptAllowFiles.includes(fileType)) {
                this.isShowFileList = true;
            } else {
                this.isShowFileList = false;
                this.isMessageTip = true;
                this.tipMessage = `不支持上传${fileType}类型的文件,请重新上传`;
                return;
            }
            if (size) {
                this.isMessageTip = true;
                this.tipMessage = '上传文件不能大于100M';
                this.uploaderList = [];
                return;
            }
            if (this.isShowFileList) {
                this.isMessageTip = false;
            }
            return true;
        },
        async afterRead(params) {
            // 创建FormData对象,上传图片需要转换二进制,这里要用到FormData
            let uploadFormData = new FormData();
            params.status = 'uploading';
            params.message = '上传中...';
            uploadFormData.append('files', params.file);
            axios
                .post('/file/uploadFile', uploadFormData, {
                    headers: {
                        'Content-Type': 'multipart/form-data',
                    },
                })
                .then((res) => {
                    let { code } = res || {};
                    if (code == '0') {
                        params.status = '';
                        params.message = '';
                        this.getFileList = res.result;
                        this.fileName = this.getFileList[0]['fileName'];
                        this.formFileData.newFileName =
                            this.getFileList[0]['newFileName'];
                        // this.quFileItem.fileObj.fileName =
                        //     this.getFileList[0]['fileName'];
                        // this.quFileItem.fileObj.newFileName =
                        //     this.getFileList[0]['newFileName'];
                        // 增加url值信息
                        // this.quFileItem.fileObj.fileUrl =
                        //     this.getFileList[0]['url'];
                        // Toast('上传成功');
                        this.saveApi();
                    } else if (code == '1') {
                        if (res.msg) {
                            let errMsg = res.msg;
                            Toast(errMsg);
                        }
                        this.uploaderList = [];
                    }
                })
                .catch((err) => {
                    params.status = 'failed';
                    params.message = '上传失败';
                    console.log(err, 'err');
                });
        },
        // 保存上传背景接口
        async saveApi() {
            let data = {
                userId: this.formFileData.userId,
                name: this.fileName,
                type: 1, // 类型
                source: 1, // 来源
                newFileName: this.formFileData.newFileName, // 图片上传的新名称
            };
            let res = await uploadBackgroundFileApi(data);
            const { code } = res;
            if (code == '0') {
                Toast('上传成功');
            } else {
                Toast.fail('保存失败');
            }
        },
        // 下载附件
        downLoadFile() {
            if (this.getFileList.length == 0) return;
            window.localStorage.href = this.getFileList[0].url;
        },
        // 删除文件
        handleRemove() {
            this.uploaderList = [];
            this.tipMessage = '';
            this.fileName = '';
        },
    },
};
</script>
 
<style lang="scss" scoped></style>

 

标签:getFileList,fileName,params,Vue2,res,let,移动,上传
From: https://www.cnblogs.com/smile-fanyin/p/18554868

相关文章

  • NetCore 3.1 大文件上传报错--413 Payload Too Large
    十年河东,十年河西,莫欺少年穷学无止境。,精益求精1、报错信息如下:RequestURL:https://xx.com/webapi/api/ad_video/UploadRequestMethod:POSTStatusCode:413PayloadTooLargeRemoteAddress:106.15.105.219:443ReferrerPolicy:strict-origin-when-cross-origin......
  • Python实现文件夹上传到Linux服务器(带日志功能)
    功能概述实现一个FileUploader类,用于将本地文件夹及其子文件上传到Linux服务器的指定目录,并支持:冲突处理策略:覆盖:直接覆盖远程文件。跳过:跳过已存在的远程文件。重命名:避免冲突,为文件生成唯一名称。日志功能:记录上传成功的文件(upload_success.log)。记录上传失败......
  • JAVA WEB 实现文件夹上传(保留目录结构)分享
    需求:大文件上传,批量上传,断点续传,文件夹上传,大文件下载,批量下载,断点下载,文件夹下载文件夹:上传下载需要支持层级结构,采用非压缩方式文件大小:100G前端:vue2,vue3,vue-cli,jquery,html,webuploader后端:JSP,springbootweb服务:tomcat数据库:mysql,oracle,达梦,国产化数据库服务......
  • 完美解决PHP无法上传大文件方法
    前端:vue2,vue3,vue-cli,html5,jquery,webuploader后端:php服务器:linux,centos,Windows,数据库:MySQL,达梦数据库,人大金仓功能:分片,断点续传,加密传输,加密存储昨天晚上一个网友给我发私信聊了一下这个需求,他也是最近在项目上遇到这个需求,但是之前没做过这块,技术积累不够,网上......
  • 百度UEDITOR编辑器复制粘贴图片上传
    编辑器:百度ueditor前端:vue2,vue3,vue-cli,html5需求:复制粘贴word内容图片,word图片转存交互,导入pdf,导入PowerPoint(PPT)要求:开源,免费,技术支持用户体验:Ctrl+V快捷键操作该说不说,最近这块应该也是挻火的,今天早上又有网友加我微信私聊,说是想了解一下这块的技术和方案。实......
  • vue2-组件化编程
    模块:向外提供特定功能的js呈现组件:用来实现局部(特定)功能效果的代码集合模块化:当应用中的js都以模块来编写的,那这个应用就是一个模块化的应用组件化:当应用中的功能都是多组件的方式来编写的,那这个应用就是一个组件化的应用编写组件-非单文件组件非单文件组......
  • WEBUPLOADER之大文件分段上传、断点续传
    前端:vue2,vue3,vue-cli,html5,webuploader后端:asp.net,jsp,springboot,php,数据库:MySQL,Oracle,SQLServer,达梦,人大金仓,国产数据库功能:超大文件上传,文件和文件夹批量上传,断点续传,加密上传,视频上传技术:百度webuploader,分块,切片,断点续传,秒传,MD5验证,纯JS实现,支持第三方......
  • SPRINGBOOT上传文件夹的三种解决方案
    前端:vue2,vue3,vue-cli,webuploader,html5后端:SpringBoot数据库:MySQL,Oracle,SQLServer,达梦,人大金仓,国产化数据库协议:HTTPWebServer:Tomcat,Resin服务器:Linux,国产化系统功能:大文件上传,断点续传,秒传,加密传输,加密存储,文件夹上传,文件夹层级结构技术:支持第三方软件集......
  • 移动开发技术——基本框架搭建
     一、实现效果二、功能说明主界面有上中下三个结构,包含四个界面:联系人、聊天、发现、我的。从聊天可以点击进入列表页面,点击列表的某一行可以进入详情页面,列表的每一行对应不同的数据,列表可以上下滚动,要用到recycleview。需要实现以下功能:activity之间的跳转,数据的绑......
  • 前端VUE上传文件+后端.NET WebApi
    前端:VUE <template><divv-loading="loading"element-loading-text="Loading..."><el-headerclass="order"><el-rowclass="topfrom":gutter="20">......